当前位置: 首页 > 面试题库 >

Redux不应该阻止重新渲染吗?

阳英朗
2023-03-14
问题内容

我有一个List显示多个Item组件的组件。List从Redux存储获取数据。

当商店更新时(例如,因为我删除了一个项目),所有Item都重新呈现。 这是为什么?

我知道我可以shouldComponentUpdate()用来阻止新的渲染,但是我认为Redux会在内部进行。

List.js

import React, { PropTypes, Component } from 'react';
import { connect } from 'react-redux';

import Item from './Item';

class List extends Component {
  render() {
    const { items } = this.props;

    return (
      <div>
        <h2>List</h2>
        {items.map((item, index) => <Item key={index} name={item.name} />)}
      </div>
    );
  }
}

const mapStateToProps = state => ({
  items: state.items
});

export default connect(
  mapStateToProps
)(List);

Item.js

import React, { PropTypes, Component } from 'react';

class Item extends Component {
  render() {
    console.log('Render', this.props.name); // The component is re-rendered even if the props didn't change
    return (
      <div>
        {this.props.name}
      </div>
    );
  }
}

Item.propTypes = {
  name: PropTypes.string
};

export default Item;

问题答案:

一些现有技术(如Dan Abramov所说):Redux是一种状态管理工具。它提供了一个HOC(connect),但该HOC 不负责组件管理
。Redux无论如何都不会管理组件的生命周期:它提供了一种有效存储和查询应用程序所需数据的方法。它在很大程度上受Om(通往React的Clojurescript桥)的影响。实际上,storeredux中的s非常类似于atomClojure中的数据类型。

现在,深入探讨问题的根源-即使您的数据 完全相同
,并且即使您确实使用过shouldComponentUpdate,您的组件仍将重新呈现。原因是Array.prototype.map 总是
在堆上产生一个新对象。结果,它们在 引用上相等 。一些代码来演示这个概念:

const myArr = [1, 2, 3]
const myArrCopy = myArr.map((n) => n);
myArr === myArrCopy // false

但是,如果使用shallowEqual,则会得到不同的结果:

const myArr = [1, 2, 3]
const myArrCopy = myArr.map((n) => n);
React.addons.shallowCompare(myArr, myArrCopy); // true

这是为什么?那是因为shallowCompare检查 值相等性
,比较数组中的每个值。但是,shallowEquals对于未开始的人可能存在以下陷阱:

const myObject = { foo: 'bar' };
const myObject2 = { foo: 'baar' };
React.addons.shallowCompare(myObject, myObject2); // true

我们的两个对象并不相同,但是会shallowCompare返回,true因为它仅比较其参数的
。如果这对您足够好,则可以简单地扩展React.PureComponentshouldComponentUpdate为您实现,并用于shallowCompare计算props和的相等性state

输入Immutable.js。这样就shallowCompare完全不需要了。考虑以下:

const myList = Immutable.List([1, 2, 3]);
const myListCopy = myList.map((n) => n);
myList.equals(myListCopy) // true

在内部,不可变共享数据,并且可以非常有效地比较数据结构以实现深度相等。话虽这么说,不可变伴随着权衡取舍:数据结构变得更加不透明,调试起来可能更加困难。总而言之,我希望这能回答您的问题。JSBin在这里:https
://jsbin.com/suhujalovi/edit
?
html,js,console



 类似资料:
  • 我有一个反应组件,它是一种形式。当用户单击发送/提交按钮时,将调用一个函数来处理数据保存并执行一些其他任务。 问题是在用户单击按钮后,组件似乎重新渲染了几次(很可能是因为它从其他组件接收的外部道具更新了)。这本身不是问题。 但是,当组件更新时,即使用户没有再次单击该按钮,也会再次调用函数。 这是我不明白的部分。为什么组件更新时会触发< code>onClick函数?我该如何防止这种情况发生? 我不

  • 有一个案例我很困惑。 我有一个对象redux状态:{show:true,creative:{name:'a',tags:[t1,t2,t3]}。此对象已通过“react redux”的“connect”功能映射到道具。 当我改变属性“显示”或“creative.name”时,它确实会触发重新渲染。但是如果我将t0追加到"creative.tags",它就不会运行re-渲染。 我必须分配一个新变量来

  • 本文向大家介绍react中怎样阻止组件渲染?相关面试题,主要包含被问及react中怎样阻止组件渲染?时的应答技巧和注意事项,需要的朋友参考一下 在极少数情况下,你可能希望能隐藏组件,即使它已经被其他组件渲染。若要完成此操作,你可以让  方法直接返回 ,而不进行任何渲染。

  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题: } 从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。 试图避免常见的错误: 颜色数组只有在通过扩展运算符从状态复制后才被修改 通过setState()传递新数组 此外,我还处理了两个组件中函数的实例绑定 但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长