Javascript React使用React.memo为子级提供错误索引
我在我的项目中遇到了一个相当大的问题,因此我不能在这里发布代码的每一部分,但我将尝试总结主要部分。 我有一个父组件,它的状态是通过useReducer管理的,它的render返回这个状态的映射。 每个子级都必须获取映射的值和索引。我还使用上下文API传递调度程序 在一些孩子身上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 (
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()
是使我的项目不会对输入组件造成输入延迟的唯一方法。这是由大量文本输入和父级中的提升状态导致的,该提升状态会在许多组件上导致不必要的重新渲染。如果我删除备忘录,项目会工作,但速度非常慢