reactjs - 如何在路径更改时重新渲染 React 组件?

标签 reactjs redux react-redux

import React, { Component } from "react";
import PostContainer from "../../components/PostContainer";
import { connect } from "react-redux";
import { withRouter } from "react-router";
import API from "../../utils/API";

class User extends Component {
  constructor(props) {
    super(props);
    this.state = {
      posts: [],
      user: []
    };
  }

  componentDidMount() {
    API.findUserById(this.props.match.params.id)
      .then(res => {
        console.log(res);
        this.setState({ user: res.data });
      })
      .catch(err => console.log(err));
  }

  render() {
    return (
      <div>
        <div>{console.log(JSON.stringify(this.state.user))}</div>
        <div className="container-fluid">
          <div className="row">
            <div className="col-8">
              {this.state.posts.map(post => (
                <PostContainer post={post} />
              ))}
              <h1>No Posts To Show!</h1>
            </div>
            <div className="col-2 sidebar-container">
              <p>{this.state.user.username}</p>
              <p>{this.state.user.id}</p>
              <p>{this.state.user.email}</p>
              <p>{this.state.user.profileImg}</p>
            </div>
            <div className="col-2 sidebar-container">
              <p>{this.props.username}</p>
              <p>{this.props.id}</p>
              <p>{this.props.email}</p>
              <p>{this.props.profileImg}</p>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

const mapStateToProps = state => {
  return {
    username: state.auth.username,
    id: state.auth.id,
    email: state.auth.email,
    profileImg: state.auth.profileImg
  };
};

export default withRouter(connect(mapStateToProps)(User));

上面的代码属于任何路径为“/user/:id”的路由。这渲染得很好,没有任何问题,但是,如果我单击将我带到不同的“/user/:id”的链接,路径会发生变化,但组件不会重新渲染。是否可以通过“欺骗”或强制 react 来重新渲染组件?

这是路由代码:

import { Switch, Route, BrowserRouter as Router } from "react-router-dom";
import NavbarFix from './components/NavbarFix';
import AuthRoute from "./utils/AuthRoute";
import AlreadyAuth from "./utils/AlreadyAuth";
import React, { Component } from "react";
import Navbar from './components/Navbar';
import NoMatch from "./pages/NoMatch";
import Submit from './pages/Submit';
import SignUp from "./pages/SignUp";
import LogIn from "./pages/LogIn";
import Posts from "./pages/Posts";
import User from "./pages/User"
// import Test from "./pages/Test";
import "./App.css";

class App extends Component {  
  render() {
    return (
      <Router>
        <div>
          <Navbar />
          <NavbarFix />
          <Switch>
            <Route exact path="/" component={AuthRoute(Posts)} />
            <Route exact path="/submit" component={AuthRoute(Submit)} />
            <Route exact path="/signup" component={AlreadyAuth(SignUp)} />
            <Route exact path="/login" component={AlreadyAuth(LogIn)} />
            <Route exact path="/user/:id" component={AuthRoute(User)} />
            <Route exact path="/item/:itemId" component={AuthRoute(User)} />
            <Route component={NoMatch} />
          </Switch>
        </div>
        </Router>
    );
  }
}

export default App;

最佳答案

只要 mapStateToProps 的返回值发生变化,Redux 就会更新组件,因此您可以在其中映射参数:

const mapStateToProps = (state, ownProps) => {
  return {
    username: state.auth.username,
    id: state.auth.id,
    email: state.auth.email,
    profileImg: state.auth.profileImg,
    viewUserId: ownProps.match.params.id,
  };
};

这与 componentDidUpdate 结合应该对您有用,因为 componentDidMount 仅在组件安装时运行,而不是更新。

您还可以使用 Redux Sagas、Thunk 等 Sidekick 在后台为您执行这些调用并相应地更新存储。

关于reactjs - 如何在路径更改时重新渲染 React 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822552/

相关文章:

reactjs - 将 Webpack React 库 bundle 为 ESM 模块 - 在非对象上调用 Object.defineProperty

javascript - 如何在前端 react 中设置后端URL

javascript - 下一页Js :pid routes

javascript - React Redux 无法读取未定义的属性 'dispatch'

reactjs - 在 Redux 中删除标准化状态下相关实体的最佳实践

react-native - 使用 Redux 在 React Native 中获取 AsyncStorage 中的随机对象

javascript - react-admin:分派(dispatch)操作以存储来自动态请求的元数据

javascript - 更改 props 后,componentDidMount 不断重复调用

javascript - react redux项目报错如何解决?

angular - 为什么 ngrx/store 示例应用程序使用多个商店? (如何设计店铺)