当前位置: 首页 > 知识库问答 >
问题:

当上一个道具等于下一个道具时,组件正在更新

杨腾
2023-03-14

在简单的待办事项列表应用程序中,我使用了FiltersContainer组件,它为Filters组件提供了道具:

// FiltersContainer.js
import { connect } from 'react-redux';
import { setVisibilityFilter } from '../actions';
import Filters from '../components/Filters';

function mapStateToProps(state) {
  const { visibilityFilter } = state.todos;

  // `visibilityFilter` variable value is - 'SHOW_ALL'.
  return {
    filters: [{
      title: 'All',
      value: 'SHOW_ALL',
      active: visibilityFilter === 'SHOW_ALL',
    }, {
      title: 'Completed',
      value: 'SHOW_COMPLETED',
      active: visibilityFilter === 'SHOW_COMPLETED',
    }, {
      title: 'Active',
      value: 'SHOW_ACTIVE',
      active: visibilityFilter === 'SHOW_ACTIVE',
    }],
  };
}

function mapDispatchToProps(dispatch) {
  return {
    onFilterClick(value) {
      dispatch(setVisibilityFilter(value));
    },
  };
}

export default connect(mapStateToProps, mapDispatchToProps)(Filters);

问题是,该组件在每次状态更改时都会呈现

例如,切换todo项将强制呈现

// FiltersContainer.js
function mapStateToProps(state) {
  const { visibilityFilter } = state.todos;

  return {
    filters: '',
  };
}

完整的应用程序代码可在-https://github.com/1ven/react-redux-todos

我错过什么了吗?


共有2个答案

况景龙
2023-03-14

问题出在shallowEqualutil函数中,该函数使用react redux库检查组件道具是否更改

此函数不进行deepEqual检查,只进行shallow检查,这就是包含数组属性的对象不等于同一对象的原因。

丰飞龙
2023-03-14

每次你从mapStateToProps返回一个新对象,这就是为什么旧道具不等于新道具。因此组件每次都被渲染

如果旧道具不等于新道具,则React渲染组件

 return {
    filters: [{
      title: 'All',
      value: 'SHOW_ALL',
      active: visibilityFilter === 'SHOW_ALL',
    }, {
      title: 'Completed',
      value: 'SHOW_COMPLETED',
      active: visibilityFilter === 'SHOW_COMPLETED',
    }, {
      title: 'Active',
      value: 'SHOW_ACTIVE',
      active: visibilityFilter === 'SHOW_ACTIVE',
    }],
  };

oldProps=对象

newProps=另一个对象(虽然内容相同,但都是不同的对象)

oldprops==newprops//no rerender

当你这么做的时候

return {
    filters: '',
  };

oldprops = ''; newprops="oldprops===newprops不渲染

 类似资料:
  • 问题内容: 我有一个组件。 如果组件没有,我想将prop设置为,否则in可以是可选的。我怎么做? 不需要道具: 需要道具: 如果和为空,则抛出错误,说是 propTypes: 谢谢 问题答案: 您不需要其他库,“ prop- types”提供了现成的功能。参见https://facebook.github.io/react/docs/typechecking-with- proptypes.htm

  • 我试图将表示组件与容器组件分开。我有一个和一个。容器负责触发redux操作,以基于当前用户获取适当的站点。 问题在于,在容器组件最初呈现之后,当前用户是异步获取的。这意味着容器组件不知道需要在其函数中重新执行代码,该函数将更新数据以发送到。我想当容器组件的一个道具(用户)发生变化时,我需要重新渲染它。如何正确地执行此操作?

  • 问题内容: 什么是对React组件prop更新进行单元测试的正确方法。 这是我的测试装置; 这可以正常工作,并且测试通过了,但是显示了反应警告消息 我要测试的只是属性的更新,而不是使用其他属性创建元素的新实例。有没有更好的方法来执行此属性更新? 问题答案: AirBnB的酶库为这个问题提供了一个优雅的解决方案。 它提供了一个setProps方法,可以在浅包装或jsdom包装上调用该方法。

  • 我有以下结构: ChildComponent只是呈现值:

  • 我试着阅读关于JS和React的书籍和观看视频,但我仍然没有更好地理解React道具

  • 我正在制作一个paginate组件,我在传递给这个paginate组件的道具上遇到了问题。元素道具正在自动更新,所以我不能使用componentWillReceiveProps来更新我的组件。 下面是我的父组件呈现和对Paginate组件的回调: 下面是我的分页组件: 代码在post advisions之后更新,但是:componentWillReceiveProps(nextProps){con