reactjs - 最好的方法是过滤内部数据以进行渲染?
问题描述
我是 Redux 的新手。我尝试过滤我的代码并传递给其他路由器组件页面。是在渲染方法中过滤我的数据的最佳方法还是我应该在其他任何地方这样做?以及如何将我的道具传递给其他路由器页面?
我做以下;
这是第一个组件页面。
class Home extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
this.props.actions.getProgramsStart();
}
render() {
const { ProgramsLoading, programs } = this.props.state;
if(programs) {
const SeriesFilterData=[];
const MoviesFilterData =[];
programs.map(FilterPrograms => {
if(FilterPrograms.programType==="series" && FilterPrograms.releaseYear >= 2010){
SeriesFilterData.push(FilterPrograms);
}
if(FilterPrograms.programType==="movie" && FilterPrograms.releaseYear >= 2010){
MoviesFilterData.push(FilterPrograms);
}
});
}
return (
<div id="home">
{ ProgramsLoading ? <div><Loader style={{ display: "block" }} content="Program List loading" /></div> : <h1>program data</h1> }
</div>
);
}
}
const mapStateToProps = (state) => {
return {
state: {
...state.home
}
};
};
const mapDispatchToProps = (dispatch) => {
return {
actions: bindActionCreators(homeActions, dispatch)
};
};
解决方案
是的,您可以通过返回先前基于您的内容来避免进入过滤器ProgramsLoading
,然后更改您的map
哪个返回一个空数组并在每个渲染中创建 2 个额外的数组,reduce
这将使用一个仅包含您需要的 2 个数组的对象,一切在 1 个循环中。
还要考虑到您调用FilterPrograms
地图的变量,这很令人困惑,因为它是当前程序,FilterPrograms
听起来更像是一个函数。
class Home extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
this.props.actions.getProgramsStart();
}
render() {
const { ProgramsLoading, programs } = this.props.state;
//check if you are loading, so you dont need to apply filters or whatever you add (filter/map creates a new array each time)
if(ProgramsLoading) return <div><Loader style={{ display: "block" }} content="Program List loading" /></div>
const defaultValue = {SeriesFilterData: [], MoviesFilterData =[]}
const reducerFunction = (accum, currentValue)=>{
//if this check is an AND for all the cases, return directly if the item doesnt match.
if(currentValue.releaseYear < 2010) return accum;
if(currentValue.programType==="series"){
accum.SeriesFilterData.push(currentValue);
} else if(currentValue.programType==="movie"){
accum.MoviesFilterData.push(currentValue);
}
return accum;
}
const results = programs.reduce( reducerFunction, defaultValue);
// using {...result} will destructure to be (SeriesFilterData, MoviesFilterData) separeted props
return (
<div id="home">
<h1>program data</h1>
<SomeComponent {...resulst} />
</div>
);
}
}
推荐阅读
- python - 即使系统关闭,如何在预定时间自动运行.exe文件?
- python - C Python api ~ 字符串分段错误
- excel - 如何将excel公式应用于数百万行
- c# - MSBUILD 命令无法创建工件
- r - R Studio gplots 库 'coplot' 函数:“评估错误(y,数据,parent.frame()):找不到对象'y'”
- html - 输入类型=“时间”格式问题
- mongodb - MongoDB Atlas 嵌套组 LDAP
- java - PayPal Webhook 验证 Java SDK
- python-3.x - 如何使用 Python3 修改包含图片的 .xlsx?
- python - 从字符串递归创建所有子集