Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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 React使用React.memo为子级提供错误索引_Javascript_Reactjs_Memoization_Use Context_Use Reducer - Fatal编程技术网

Javascript React使用React.memo为子级提供错误索引

Javascript React使用React.memo为子级提供错误索引,javascript,reactjs,memoization,use-context,use-reducer,Javascript,Reactjs,Memoization,Use Context,Use Reducer,我在我的项目中遇到了一个相当大的问题,因此我不能在这里发布代码的每一部分,但我将尝试总结主要部分。 我有一个父组件,它的状态是通过useReducer管理的,它的render返回这个状态的映射。 每个子级都必须获取映射的值和索引。我还使用上下文API传递调度程序 在一些孩子身上 function ParentComponent(props) { const [state, dispatch] = useReducer(initialData, reducer); return (

我在我的项目中遇到了一个相当大的问题,因此我不能在这里发布代码的每一部分,但我将尝试总结主要部分。 我有一个父组件,它的状态是通过useReducer管理的,它的render返回这个状态的映射。 每个子级都必须获取映射的值和索引。我还使用上下文API传递调度程序 在一些孩子身上

function ParentComponent(props) {
  const [state, dispatch] = useReducer(initialData, reducer);

  return (
    <div>
      <MyContext.Provider value={dispatch}>
        {state.myArray.map((value, index) => (
          <ChildComponent value={value} index={index} />
        ))}
      </MyContext.Provider>
    </div>
  );
}

/* Other file */

function ChildComponent({value, index}) {
    const dispatch = useContext(MyContext);

    return <div>
        {/* Uses value and index to display some data */}
    </div>
}

export default React.memo(ChildComponent, (prevProps, nextProps) => !_.isEqual(prevProps, nextProps));

函数父组件(道具){
const[state,dispatch]=useReducer(initialData,reducer);
返回(
{state.myArray.map((值,索引)=>(
))}
);
}
/*其他文件*/
函数ChildComponent({value,index}){
const dispatch=useContext(MyContext);
返回
{/*使用值和索引显示某些数据*/}
}
导出默认的React.memo(ChildComponent,(prevProps,nextProps)=>!\u0.isEqual(prevProps,nextProps));
树组件中的一些child必须使用
React.memo
以避免无用的重新渲染,
ChildComponent
就是其中之一。 我正在使用lodash函数
。.isEqual
来比较道具,以了解组件何时必须重新渲染。 问题如下。组件树中的一个“我的组件”将项目添加到
ParentComponent
状态的
myArray
属性中。 无论如何,当我添加一个项时,从ParentComponent映射中呈现的每个
ChildComponent
都会收到相同的索引0,这会造成很多问题。
ParentComponent
具有正确的索引(当我将它们记录在映射中时,它们是正确的索引),但就像
ChildComponent
没有得到它一样

有什么办法解决这个问题吗?也许这与
React有关。memo

接受一个回调,该回调应该确定
prevProps
nextProps
是否相等,但您返回的是否定的结果


还应将其视为最后的手段,因为当数组中的元素彼此重新排序时,这将无法正常工作。只要有可能,您应该始终从数据中获取密钥。

我知道,这对我来说也很奇怪,但如果我不使用否定,则ChildComponent不会重新渲染all@Sosnos在你责怪
React.memo()
之前,不要使用
React.memo()
让它工作。这是一种优化,正确使用时不会改变逻辑的基本行为,只会跳过冗余处理。使用
React.memo()
是使我的项目不会对输入组件造成输入延迟的唯一方法。这是由大量文本输入和父级中的提升状态导致的,该提升状态会在许多组件上导致不必要的重新渲染。如果我删除备忘录,项目会工作,但速度非常慢