我正在尝试将展示组件与容器组件分开。我有一个SitesTable和一个SitesTableContainer。容器负责触发 redux 操作以根据当前用户获取适当的站点。
SitesTable
SitesTableContainer
问题是,在容器组件首次呈现后,当前用户是异步获取的。这意味着容器组件不知道它需要重新执行其componentDidMount函数中的代码,这将更新要发送到的数据SitesTable。我认为当容器组件的某个 props(用户)发生变化时,我需要重新呈现容器组件。我该如何正确执行此操作?
componentDidMount
class SitesTableContainer extends React.Component { static get propTypes() { return { sites: React.PropTypes.object, user: React.PropTypes.object, isManager: React.PropTypes.boolean } } componentDidMount() { if (this.props.isManager) { this.props.dispatch(actions.fetchAllSites()) } else { const currentUserId = this.props.user.get('id') this.props.dispatch(actions.fetchUsersSites(currentUserId)) } } render() { return <SitesTable sites={this.props.sites}/> } } function mapStateToProps(state) { const user = userUtils.getCurrentUser(state) return { sites: state.get('sites'), user, isManager: userUtils.isManager(user) } } export default connect(mapStateToProps)(SitesTableContainer);
为了确保SitesTableContainer组件在 prop 更改时重新渲染user,您可以使用componentDidUpdate生命周期方法。每当组件更新时(包括 prop 更改时),都会调用此方法。
user
componentDidUpdate
你可以通过以下方式修改SitesTableContainer组件来处理 prop 的更新user:
import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import { fetchAllSites, fetchUsersSites } from './actions'; // Import your action creators class SitesTableContainer extends React.Component { static propTypes = { sites: PropTypes.object, user: PropTypes.object, isManager: PropTypes.bool, dispatch: PropTypes.func.isRequired // Ensure dispatch is provided by connect }; componentDidMount() { this.fetchSites(); } componentDidUpdate(prevProps) { // Check if the user prop has changed if (this.props.user !== prevProps.user) { this.fetchSites(); } } fetchSites() { const { dispatch, isManager, user } = this.props; if (isManager) { dispatch(fetchAllSites()); } else { const currentUserId = user.get('id'); dispatch(fetchUsersSites(currentUserId)); } } render() { return <SitesTable sites={this.props.sites} />; } } const mapStateToProps = (state) => { const user = userUtils.getCurrentUser(state); return { sites: state.get('sites'), user, isManager: userUtils.isManager(user) }; }; export default connect(mapStateToProps)(SitesTableContainer);
在此更新版本中:
fetchSites
isManager
propTypes
get propTypes
通过这些更改,SitesTableContainer每当 prop 发生更改时,您的组件就会重新获取站点user,确保将正确的数据传递给组件SitesTable。