【问题标题】:Why does my redux container render when unrelated state changes?为什么我的 redux 容器会在不相关的状态更改时呈现?
【发布时间】:2018-01-23 22:22:24
【问题描述】:

我的 redux 状态如下所示:

{ 
  entities: {
    cars: {
      byId: {},
      isFetching: true
    },
    persons: {
      byId: {},
      isFetching: false
    }  
  }
}

我的个人容器:

class PersonPageComponent extends React.PureComponent<
  IPersonPageProps & InjectedAuthRouterProps,
  {}
> {
  render() {
    console.log('render´);
    return (<p>helllo</p>);
  }
}

const mapStateToProps = (state: RootState, ownProps: { title: string }) => ({
  list: _.values(state.entities.persons.byId), // personsSelector(state)  
});

export const PersonPage = userIsAuthenticated(
  connect<IPersonPageProps, {}, {}>(
    mapStateToProps
  )(PersonPageComponent)
);

当我在 entity.cars 下的 redux 状态发生变化时,为什么我的 Person 容器会重新渲染?自“实体”更改后是否应该触发渲染? GET_CARS 操作设置entities.cars.isFetching = true。这是否会导致 PersonComponent 重新渲染?

【问题讨论】:

    标签: javascript reactjs typescript redux


    【解决方案1】:

    state.entities.persons 在更新cars 后可能是同一个对象,但_.values(state.entities.persons.byId) 每次执行都会生成一个新对象——_.values 不会缓存/重用其结果,即使输入保持不变。

    由于提供给PureComponent 的道具现在是不同的对象(即使内容相同),所以会触发重新渲染。

    【讨论】:

    • 如果你想避免重新渲染,你可以利用提供的记忆,例如通过重新选择:github.com/reactjs/reselect
    • 谢谢!我添加了重新选择,创建了一个选择器,现在它只在我想要的时候呈现:) 下面是一些完整性代码:export const personListSelector = createSelector&lt;RootState, { [byId: string]: Readonly&lt;IPerson&gt; }, ReadonlyArray&lt;IPerson&gt; &gt;(state =&gt; state.entities.persons.byId, result =&gt; _.values(result));
    猜你喜欢
    • 2023-02-25
    • 2016-01-21
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2019-04-10
    • 2022-10-13
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多