React.js history.push在一个单独的函数中?

问题描述 投票:0回答:4

你能用React.js history.push函数帮我吗?

我有一个可以按下的图标。 onClick调用handleRemoveFavourite函数,该函数从localStrorage中过滤掉当前项,并将更新后的字符串设置为storage。这很好用。

存储更新完成后,程序应将用户重新路由到根页面/收藏夹。重新路由在底部示例中运行良好。但是如何在handleRemoveFavourites函数中执行此操作?

这是我想要的代码

handleRemoveFavourite = () => {
    const { name } = this.props.workout;
    let savedStorage = localStorage.saved.split(",");
    let cleanedStorage = savedStorage.filter(function(e) {
      return e !== name;
    });
    localStorage.setItem("saved", cleanedStorage.toString());
    history.push("/favourites")
  };

  renderHeartIcon = () => {
    return (
      <Route
        render={({ history }) => (
          <Rating
            icon="heart"
            defaultRating={1}
            maxRating={1}
            onClick={this.handleRemoveFavourite}
          />
        )}
      />
    );
  };

重新路由工作正常:

  renderHeartIcon = () => {
    return (
      <Route
        render={({ history }) => (
          <Rating
            key={1}
            icon="heart"
            defaultRating={1}
            maxRating={1}
            size="large"
            onClick={() => history.push("/favourites")}
          />
        )}
      />
    );
  };

整个组件看起来像这样:

import React from "react";
import {
  Container,
  Grid,
  Icon,
  Label,
  Table,
  Header,
  Rating,
  Segment
} from "semantic-ui-react";
import { Link, Route } from "react-router-dom";

export default class WorkoutComponent extends React.PureComponent {
  renderChallengeRow = workouts => {
    let { reps } = this.props.workout;
    reps = reps.split(",");

    return workouts.map((item, i) => {
      return (
        <Table.Row key={item.id}>
          <Table.Cell width={9}>{item.name}</Table.Cell>
          <Table.Cell width={7}>{reps[i]}</Table.Cell>
        </Table.Row>
      );
    });
  };

  handleRemoveFavourite = () => {
    const { name } = this.props.workout;
    let savedStorage = localStorage.saved.split(",");
    let cleanedStorage = savedStorage.filter(function(e) {
      return e !== name;
    });
    localStorage.setItem("saved", cleanedStorage.toString());
    // history.push("/favourites");
  };

  renderHeartIcon = () => {
    return (
      <Route
        render={({ history }) => (
          <Rating
            key={1}
            icon="heart"
            defaultRating={1}
            maxRating={1}
            size="large"
            onClick={this.handleRemoveFavourite}
          />
        )}
      />
    );
  };

  render() {
    const { name, workouts } = this.props.workout;
    const url = `/savedworkout/${name}`;
    return (
      <Grid.Column>
        <Segment color="teal">
          <Link to={url}>
            <Header as="h2" to={url} content="The workout" textAlign="center" />
          </Link>
          <Table color="teal" inverted unstackable compact columns={2}>
            <Table.Body>{this.renderChallengeRow(workouts)}</Table.Body>
          </Table>
          <br />
          <Container textAlign="center">
            <Label attached="bottom">{this.renderHeartIcon()}</Label>
          </Container>
        </Segment>
        <Link to="/generate">
          <Icon name="angle double left" circular inverted size="large" />
        </Link>
      </Grid.Column>
    );
  }
}
javascript reactjs react-router-dom
4个回答
2
投票

既然你正在使用qazxsw poi,你可以使用qazxsw poi来实现这一点。

react-router

withRouter包装类名。

像这样:

而不是这样做:

import { withRouter } from 'react-router-dom'

将它分开如下:

withRouter

在行尾:

export default class App .....

现在你可以像这样使用:

class App ...

你可以从export default withRouter(App)中删除handleRemoveFavourite = () => { const { name } = this.props.workout; let savedStorage = localStorage.saved.split(","); let cleanedStorage = savedStorage.filter(function(e) { return e !== name; }); localStorage.setItem("saved", cleanedStorage.toString()); this.props.history.push("/favourites"); };

Route

1
投票
renderHearIcon()

1
投票

您面临的问题是,您正在为历史支柱提供renderHeartIcon = () => { return ( <Rating key={1} icon="heart" defaultRating={1} maxRating={1} size="large" onClick={this.handleRemoveFavourite} /> ); }; ,以便它在组件函数调用上传播。但是你没有将它传播到onClick={this.handleRemoveFavourite} => onClick={()=>this.handleRemoveFavourite(history)} handleRemoveFavourite = () => { => handleRemoveFavourite = (history) => { 函数。

你需要在匿名函数调用中包装<Route>。喜欢

handleRemoveFavourite

然后将其作为函数中的有效参数接受

this. handleRemoveFavourite

应该解决它


0
投票

换到 onClick={() => this.handleRemoveFavourite(history)} 应该有效。

EDITED

您的组件是否在路线中?如果是这样,handleRemoveFavourite = (history) => {...} 将起作用。我测试过改变你的课程来运行我的项目。

this.props.history.push("/favourites");
© www.soinside.com 2019 - 2024. All rights reserved.