javascript - React 正在重新呈现我的列表,即使数组中的每个子项都有其唯一的键

标签 javascript reactjs

因此,据我所知,React 只会使用新键重新呈现新元素。不过那对我不起作用。 我有一个帖子列表,仅限于 3 个。 当用户滚动到页面底部时,我将 3 添加到限制,这意味着在页面底部应该显示 3 个较旧的帖子。 我现在所做的工作,但整个列表正在重新呈现。它会跳到顶部,这也是不需要的(不过我可以解决这个问题,主要问题是重新渲染)。他们都有唯一的 key 。我怎样才能防止这种行为?

thisGetsCalledWhenANewPostComesIn(newPost){
    let newPosts = _.clone(this.state.posts);
    newPosts.push(newPost);
    newPosts.sort((a,b) => b.time_posted - a.time_posted); 
    this.setState({posts: newPosts});
}

render(){
     return (
         <div ref={ref => {this.timelineRef = ref;}} style={styles.container}>
             {this.state.posts.map(post =>
                 <Post key={post.id} post={post} />
             )}
         </div>
     );
}

最佳答案

单独使用唯一键并不能阻止重新渲染未更改的组件。除非你扩展 PureComponent或实现 shouldComponentUpdate对于组件,React 必须 render() 组件并将其与最后的结果进行比较。

那么为什么我们需要keys什么时候才是真正关于shouldComponentUpdate

给列表中的每个组件一个唯一键的目的是将 props 传递给“正确的”组件实例,以便它们可以正确地比较新旧 props。

假设我们有一个项目列表,例如:

  • A -> componentInstanceA
  • B -> componentInstanceB
  • C -> componentInstanceC

应用过滤器后,必须重新呈现列表以显示新的组件列表,例如:

  • C -> ?

如果没有适当的唯一键,之前呈现A 的组件现在将收到C 的prop(s)。即使 C 没有改变,组件也必须重新渲染,因为它接收到完全不同的数据:

  • C -> componentInstanceA//哦不!

通过适当的唯一键,呈现C 的组件将再次收到CshouldComponentUpdate 然后将能够识别 render() 输出将是相同的,并且组件将不必重新渲染:

  • C -> componentInstanceC

如果您的项目列表需要很长时间才能呈现,例如如果它是一个长列表或每个元素都是一组复杂的数据,那么您将受益于防止不必要的重新呈现。

个人轶事

在一个包含 100 个项目列表的项目中,每个项目产生 1000 个 DOM 元素,从

list.map((item, index) => <SomeComp key={index} ... />)

list.map(item => <SomeComp key={item.id} ... />)

将渲染时间缩短了几秒钟。切勿使用数组索引作为键。

关于javascript - React 正在重新呈现我的列表,即使数组中的每个子项都有其唯一的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185975/

相关文章:

javascript - 需要对象比较帮助

javascript - 如何在点击时正确更改 react-bootstrap DropdownButton 的标题?

javascript - 如何在 next.js 应用中使用谷歌分析?

javascript - 在nodejs中开发报告引擎

javascript - React 导入前的 '@' 是什么意思?

reactjs - 使用 React 和 Webpack 删除未使用的 css

reactjs - 标签列表未显示在图表中?

Javascript 根据选择更改多个 Div 内容

css - 如何做 `absolute` 定位元素连同 `justifyContent`

javascript - 如何使用 react-select(如 stackoverflow)创建自定义下拉列表?