首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用redux/reselect时防止组件重呈现?

如何在使用redux/reselect时防止组件重呈现?
EN

Stack Overflow用户
提问于 2019-05-26 23:02:53
回答 1查看 3.6K关注 0票数 0

我经常收到对我的状态的更新,它会在没有访问不断变化的状态属性的组件中导致一些不必要的重新呈现。

组件A和B是以相同的方式创建的,组件A具有valueKeys‘速度’、‘时间’和组件B没有valueKeys []。

当更新速度和时间时,每个数组再添加一个值,组件A按预期重新呈现,而组件B也重新呈现。

我认为这是因为用于makeValuesSelector引用的makeValuesSelector输入正在发生变化吗?尽管该值是一个空数组。

在这种情况下,有什么方法可以防止组件B重新呈现吗?

状态

代码语言:javascript
复制
{
 speed: [ 5, 4, 6],
 time: [ 1, 2, 3]
}

ValueKeys

代码语言:javascript
复制
[ 'speed', 'time']

选择器

代码语言:javascript
复制
const valuesSelector = state => state.values;
const keysSelector= (state, props) => props.valueKeys;

const makeValuesSelector = () =>
  createSelector(
    [valuesSelector, keysSelector],
    (values, keys) => {
      let usedValues = {};
      keys.forEach(key => {
        if (values[key]) {
          usedValues[key] = values[key];
        }
      });
      return usedValues;
    }
  );

组件

代码语言:javascript
复制
const makeMapStateToProps = () => {
  const valuesSelector = makeValuesSelector();
  const mapStateToProps = (state, props) => ({
    values: valuesSelector(state, props),
  });
  return mapStateToProps;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-25 21:04:06

过了一段时间,我又回到了这个问题上,因为它造成了严重的性能瓶颈。我通过在选择器中使用自定义相等检查来检查状态内的对象是否发生了更改,从而解决了这个问题。

如果组件所需的对象在状态内未发生更改,则由于阻止它的自定义等式检查,makeValuesSelector将不会运行。因为makeValuesSelector还没有运行,那么它将阻止组件重新呈现。就我所描述的情况而言,组件B不会重新呈现.

代码语言:javascript
复制
const valuesSelector = state => state.values;
const keysSelector= (state, props) => props.valueKeys;

const equalityCheckShallow = (currentVal, previousVal) => {
  let noUpdate = true;
  Object.keys(currentVal).forEach(key => {
    if (currentVal[key] !== previousVal[key]) {
      noUpdate = false;
    }
  });
  return noUpdate;
};

const createSelectorWithShallowCompare = createSelectorCreator(defaultMemoize, equalityCheckShallow);

const makeValuesSelector = () =>
  createSelectorWithShallowCompare(
    [valuesSelector, keysSelector],
    (values, keys) => {
      let usedValues = {};
      keys.forEach(key => {
        if (values[key]) {
          usedValues[key] = values[key];
        }
      });
      return usedValues;
    }
  );

希望这能对未来的人有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56318014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档