Javascript 在Useffect中使用还原状态

Javascript 在Useffect中使用还原状态,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,Hello All您可以在选择器函数中包含photoIdsToFetch计算逻辑,以减少状态更改导致的渲染数量 const photoIdsToFetch = useSelector(state => { const { photos: reducerPhotos, loadingPhotoIds } = state.root.photos; const { photos: completedFormPhotos } = completedForm; const p

Hello All您可以在选择器函数中包含
photoIdsToFetch
计算逻辑,以减少状态更改导致的渲染数量

const photoIdsToFetch = useSelector(state => {
    const { photos: reducerPhotos, loadingPhotoIds } = state.root.photos;
    const { photos: completedFormPhotos } = completedForm;
    const photoIds = Object.keys(completedFormPhotos || {});
    const photoIdsToFetch = photoIds.filter(pId => {
      const photo = reducerPhotos[pId] || {};
      return !loadingPhotoIds.includes(pId) && !photo.blobUrl;
    });
    return photoIdsToFetch;
  },
  equals
);
但是选择器函数没有被记忆,它每次都返回一个新的数组对象,因此对象相等在这里不起作用。您需要提供一个isEqual方法作为第二个参数(用于比较两个数组的值相等性),以便选择器在ID相同时返回相同的对象。您可以编写自己的或
deep equals
库,例如:

import equal from 'deep-equal';
fetchFormPhotos
将仅以这种方式依赖于
[photoIdsToFetch,dispatch]


我不确定减速机函数如何改变状态,因此这可能需要一些微调。其思想是:仅从您所依赖的存储中选择状态,这样存储的其他部分就不会导致重新渲染。

是否应该是:const{photos:reducerPhotos,loadingPhotoIds}=photostate?它应该是:const{photos:reducerPhotos**,loadingPhotoIds}=photostate;在“fetchFormPhotos”回调中。感谢您的回答!因此,“photostate”或“photostate.photos”是每次获取照片时更新的内容。这是否意味着选择器每次都会生成新的“photoIdsToFetch”数组?reducer状态如下所示:state={root:{photos:{loadingPhotoIds:[],photos:{[photo_id_1]:{blobUrl:'',error:},},}}。选择器将遍历state.root.photos.photos以确定photoIdsToFetch如果提供一个按值比较数组的等质量函数,则仅当photoIdsToFetch实际更改时,它才会生成一个新数组。你能把你的减缩函数也包括在问题中吗?用减缩函数更新了问题:)