,这是场景:
- 用户登录,他们将发送
/home
-
/home
有一个项目列表 - 单击一个项目将用户
/documents/58
带来数字是项目 - 此URL列出了与项目相关的所有文档
- 用户使用
navbar
导航回/home
,然后单击另一个项目
我遇到的问题是当用户转到/documents/58
时,然后导航回/home
,然后单击另一个项目(例如/documents/61
),它仍然显示/documents/58
文档,直到服务器使用/documents/58
响应。
如何清除已从redux状态(mapstatetoprops)映射的Prop的当前值?
我知道我需要使用componentWillUnmount()
,只是不确定该放入什么。this.props.planning_meeting = undefined
导致read-only
错误。
这是我为此容器所拥有的:
import _ from 'lodash';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
class PlanningMeeting extends Component {
componentWillUnmount() {
this.props.planning_meeting = undefined;
}
renderDocuments() {
const { planning_meeting } = this.props;
if (!planning_meeting) {
return <div>Loading...</div>
}
if (_.isEmpty(this.props.planning_meeting)) {
return (
<li>Nothing at this time.</li>
);
} else {
return _.map(this.props.planning_meeting, pm => {
return (
<li key={pm.document}>
<Link to={`/documents/${pm.document}`}>{pm.document}</Link>
</li>
);
});
}
}
render() {
return (
<div className='panel panel-default'>
<div className='panel-heading'>
<h4><strong>Planning Meeting</strong></h4>
</div>
<div className='panel-body'>
<ul className='survey-list'>{this.renderDocuments()}</ul>
</div>
</div>
);
}
}
function mapStateToProps(state) {
return {
planning_meeting: state.documents.planning_meeting
}
}
export default connect(mapStateToProps)(PlanningMeeting);
从上面的评论继续,您可以将其更进一步并构建状态,以便每个项目都由唯一的ID(PM.Document)组织。
您可以在组件中访问planning_meeting[id]
,其中可以从URL参数获得的id === pm.document
。在这种情况下,您无需费心清理道具。
这种方法的其他好处是,您可以确保组件之间的路线过渡之间的正确数据。例如,如果您希望用户直接从/documents/1
导航到/documents/2
,则React路由器将不会卸载计划会议组件,因为它已在新路线中重复使用。在这种情况下,您的清晰道具逻辑将无法工作,因为componentWillUnmount
不会被调用。通过通过文档ID将项目存储在状态下,您可以确保即使导航到新路线也将填充适当的数据。
这本质上可以缓存您的状态,因此,如果您打算修改状态中的数据,则需要确保定义Redux操作以相应地更新状态。