过滤 redux 道具时更新反应状态
updating react state when filtering redux props
我是 React 和 redux 的新手,在过滤我所谓的洞察力(文章、案例研究、报告)时遇到了一些麻烦。我想按行业过滤,但我无法达到使用过滤后的见解更新状态的地步。
InsightsPage.js
const FilterLink = ({
filter,
data,
children
}) => {
return(
<a href="#"
onClick={e => {
e.preventDefault();
getVisibleInsights(
data,
filter
)
}}
>{children}
</a>
);
};
const getVisibleInsights = (
insights,
filter
) => {
switch (filter) {
case 'SHOW_ALL':
return insights;
case 'SHOW_AEROSPACE':
return insights.filter(
i => i.industry == 'aerospace');
case 'SHOW_HEALTHCARE':
return insights.filter(
i => i.industry == 'healthcare');
}
}
class InsightsPage extends React.Component {
render() {
const insights = this.props.insightsPageData.insights;
return(
<div className="col-md-12">
<h2>{this.props.insightsPageData.header}</h2>
<div className="col-md-4">
<InsightsList insights={this.props.visibleInsights} />
</div>
<div className="col-md-8">
{this.props.children}
</div>
<p>
Show:
{' '}
<FilterLink filter="SHOW_ALL" data={insights}>All</FilterLink>
{' '}
<FilterLink filter="SHOW_AEROSPACE" data={insights}>Aerospace</FilterLink>
{' '}
<FilterLink filter="SHOW_HEALTHCARE" data={insights}>Healthcare</FilterLink>
</p>
</div>
);
}
}
InsightsPage.propTypes = {
insightsPageData: PropTypes.object.isRequired
};
function mapStateToProps(state, ownProps) {
return {
insightsPageData: state.insightsPageData,
visibilityFilter: state.insightsPageData.visibilityFilter,
visibleInsights: getVisibleInsights(state.insightsPageData.insights, state.insightsPageData.visibilityFilter )
}
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(actions, dispatch)
};
}
export default connect(mapStateToProps, mapDispatchToProps)(InsightsPage);
我正在将 visibilityFilter 设置为 'SHOW_ALL'
来初始化我的状态
initialState.js
export default {
employeesPageData: {employees: [], page_info:{stats: []}},
insightsPageData: {insights:[], visibilityFilter: 'SHOW_ALL'},
newsArticlesPageData: {news_articles:[], page_info:{}},
}
那么,更新 InsightsPage 状态的最佳方式是什么?它们都显示在开头,所以我的 InsightsList 正在运行。非常感谢。
您的 <FilterLinks>
功能组件需要 3 个道具。你是在推第一个,但你不是在推数据的支柱。修改如下:
<FilterLink filter="SHOW_AEROSPACE" data={this.props.insightsPageData} updateInsights={this.updatInsights.bind(this)} >Aerospace</FilterLink>
// Where updateInsights is something like:
function updateInsights (updated_insights){
this.setState({insights: updated_insights});
}
然后您可以修改 onClick 以调用:
this.props.updateInsights(getVisibleInsights(data, filter));
请注意,此方法 仅设置 InsightsPage 的本地组件状态,而不是您的 Redux 存储。
实现后者:
您必须在减速器上使用新状态。所以:点击时调度动作,该动作会触发一个使用过滤状态的减速器。然后更改将传播到组件树
我是 React 和 redux 的新手,在过滤我所谓的洞察力(文章、案例研究、报告)时遇到了一些麻烦。我想按行业过滤,但我无法达到使用过滤后的见解更新状态的地步。
InsightsPage.js
const FilterLink = ({
filter,
data,
children
}) => {
return(
<a href="#"
onClick={e => {
e.preventDefault();
getVisibleInsights(
data,
filter
)
}}
>{children}
</a>
);
};
const getVisibleInsights = (
insights,
filter
) => {
switch (filter) {
case 'SHOW_ALL':
return insights;
case 'SHOW_AEROSPACE':
return insights.filter(
i => i.industry == 'aerospace');
case 'SHOW_HEALTHCARE':
return insights.filter(
i => i.industry == 'healthcare');
}
}
class InsightsPage extends React.Component {
render() {
const insights = this.props.insightsPageData.insights;
return(
<div className="col-md-12">
<h2>{this.props.insightsPageData.header}</h2>
<div className="col-md-4">
<InsightsList insights={this.props.visibleInsights} />
</div>
<div className="col-md-8">
{this.props.children}
</div>
<p>
Show:
{' '}
<FilterLink filter="SHOW_ALL" data={insights}>All</FilterLink>
{' '}
<FilterLink filter="SHOW_AEROSPACE" data={insights}>Aerospace</FilterLink>
{' '}
<FilterLink filter="SHOW_HEALTHCARE" data={insights}>Healthcare</FilterLink>
</p>
</div>
);
}
}
InsightsPage.propTypes = {
insightsPageData: PropTypes.object.isRequired
};
function mapStateToProps(state, ownProps) {
return {
insightsPageData: state.insightsPageData,
visibilityFilter: state.insightsPageData.visibilityFilter,
visibleInsights: getVisibleInsights(state.insightsPageData.insights, state.insightsPageData.visibilityFilter )
}
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(actions, dispatch)
};
}
export default connect(mapStateToProps, mapDispatchToProps)(InsightsPage);
我正在将 visibilityFilter 设置为 'SHOW_ALL'
来初始化我的状态initialState.js
export default {
employeesPageData: {employees: [], page_info:{stats: []}},
insightsPageData: {insights:[], visibilityFilter: 'SHOW_ALL'},
newsArticlesPageData: {news_articles:[], page_info:{}},
}
那么,更新 InsightsPage 状态的最佳方式是什么?它们都显示在开头,所以我的 InsightsList 正在运行。非常感谢。
您的 <FilterLinks>
功能组件需要 3 个道具。你是在推第一个,但你不是在推数据的支柱。修改如下:
<FilterLink filter="SHOW_AEROSPACE" data={this.props.insightsPageData} updateInsights={this.updatInsights.bind(this)} >Aerospace</FilterLink>
// Where updateInsights is something like:
function updateInsights (updated_insights){
this.setState({insights: updated_insights});
}
然后您可以修改 onClick 以调用:
this.props.updateInsights(getVisibleInsights(data, filter));
请注意,此方法 仅设置 InsightsPage 的本地组件状态,而不是您的 Redux 存储。
实现后者:
您必须在减速器上使用新状态。所以:点击时调度动作,该动作会触发一个使用过滤状态的减速器。然后更改将传播到组件树