reactjs - 为什么 react 会重新创建列表中的所有项目,而 shouldComponentUpdate 从未调用过
问题描述
给定以下代码,如何避免重新渲染整个列表?对于列表中的所有项目,当父组件 props 更改并且重新安装所有项目时,从不调用 shouldComponentUpdate 。
父列表组件:
class TaskList extends React.Component {
tasksList = (tasks) => {
return _.map(tasks, (task) => (<TaskCard key={task.id} task={task}/>));
};
render() {
const {tasks, loadMore} = this.props;
return (
<React.Fragment>
<div id="tasks-list">
{this.tasksList(tasks)}
</div>
<div>
<button type="button" onClick={loadMore}>Load more</button>
</div>
</React.Fragment>
);
}
子项组件:
class TaskCard extends React.Component {
componentWillMount() {
console.log('component will always mount');
}
shouldComponentUpdate(nextProps) {
console.log('should component update never called');
}
render() {
const {task} = this.props;
return (
<div key={task.id}>
<div className="card">
<div className="card-header">{renderStatus(task.status)}{task.url}</div>
<div className="card-body">
<TaskResults task={task}/>
</div>
</div>
</div>
);
}
按钮单击上的 loadMore 方法将新任务与旧任务一起添加到列表中。我不希望旧的被重新渲染。非常感谢您的任何想法。
解决方案
谢谢,我发现了问题所在,上面的代码是有效的,实际上问题在于我如何创建父组件
export default withTasks(TaskList);
每次 props 更改时,此 HOC 都会重新创建父列表,因此创建父组件的内容和方式非常重要。谢谢
推荐阅读
- c# - 创建多个 xml 文件并将其导出为一个 zip 文件的最佳方法是什么
- json - React 在 PUT 上发送一个空的 JSON 对象
- routes - 部署到 Netlify 时,Sapper Svelte 路由不工作并且页面丢失
- r - Apriori 模型没有显示出明显的关联
- ruby-on-rails - Rails 获取参数在生产中为零
- sql - 在 LIKE 函数中使用正则表达式进行 SQL 查询
- python - Discord bot(on_message 事件不会让命令工作*)
- node.js - 如何在没有两个查询的情况下在 Knex 中执行此操作
- java - 如何以编程方式设置属性的值
- python - 下载带有请求的大文件时遇到问题?