Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在对象上重新使用选择器筛选?_Javascript_Reactjs_Redux_React Redux_React Hooks - Fatal编程技术网

Javascript 在对象上重新使用选择器筛选?

Javascript 在对象上重新使用选择器筛选?,javascript,reactjs,redux,react-redux,react-hooks,Javascript,Reactjs,Redux,React Redux,React Hooks,所以我使用redux和useSelector钩子从存储中获取数据 我可以过滤reducer数组中的特定数据,以便组件仅在过滤数据更改时更新,例如: const images = useSelector(state => state.Reducer.images.filter(x => x.id === someID)); 然而,当我尝试对一个对象执行相同的操作时,即使存储区没有更改,组件也总是重新渲染。e、 g: const images = useSelector(state =

所以我使用redux和useSelector钩子从存储中获取数据

我可以过滤reducer数组中的特定数据,以便组件仅在过滤数据更改时更新,例如:

const images = useSelector(state => state.Reducer.images.filter(x => x.id === someID));
然而,当我尝试对一个对象执行相同的操作时,即使存储区没有更改,组件也总是重新渲染。e、 g:

const images = useSelector(state => Object.keys(state.Reducer.images)
  .filter(x => x === someID)
  .reduce((arr, key) => {
    arr.push(state.Reducer.images[key].data);
    return arr;
  }, []));

为什么会发生这种情况?我如何使其仅在数据更改时更新?我假设将一些深度比较函数传递给useSelector?

您应该能够通过使用
shallowEqual
避免这些重新渲染。这将防止新引用一直被认为是不同的

const images = useSelector(state => Object.keys(state.Reducer.images)
  .filter(x => x === someID)
  .reduce((arr, key) => {
    arr.push(state.Reducer.images[key].data);
    return arr;
  }, []), shallowEqual);

不错,谢谢