我正在尝试通过指定特殊道具来记住React组件的方法。
例如,如果您使用React.memo
-它会基于所有道具来记住组件。
我要实现的目标是能够将特定道具作为对util的依赖项(例如SuperMemo
)进行传递,并将根据这些道具来记住组件。该方法非常类似于recompose -在导出之前先组成组件。
这是示例代码
import React from "react";
const isFunction = value =>
value &&
(Object.prototype.toString.call(value) === "[object Function]" ||
"function" === typeof value ||
value instanceof Function);
export const memo = (Comp, resolver) => {
if (isFunction(resolver)) {
const Memoized = props => {
const deps = resolver(props);
if (deps && deps.length) {
// eslint-disable-next-line react-hooks/rules-of-hooks
return React.useCallback(React.createElement(Comp, props), deps);
}
return React.createElement(Comp, props);
};
Memoized.displayName = `memoized(${Comp.name})`;
return Memoized;
}
return React.memo(Comp);
};
export default memo;
这是将其用于组成组件的方式
import Todo from "./Todo";
import memo from "../memo";
export default memo(Todo, props => [props.text]);
我在这里有一个有效的代码框-memo-deps
这就是我观察到的-
React.useCallback
或任何钩子,因为React需要知道钩子的调用顺序,而在条件语句中使用它可能会在运行时弄乱顺序。React.useCallback
在有条件的情况下非常整洁,因为我知道在运行时顺序将保持不变React.useCallback
替换为lodash.memoize
,最终结果将几乎相同lodash.memoize
之类的外部库或构建自定义的回忆实现,而React.useCallback
几乎可以为我完成工作我不确定这是怎么回事(这是我的问题)—
lodash.memoize
来记住它们lodash.memoize
和React.useCallback
并不相同React.memo
的情况下,React也会在找出渲染之前执行该功能(也许是检查prevProps与newProps吗?)React.createElement
,我还能如何记住React.useCallback
?我为什么要这样做的原因-
我不想每次将处理程序(带有值和事件的闭包)传递给包装在React.memo
中的组件时都记住它们。我希望能够以声明方式编写组件的备注依赖。
答案 0 :(得分:5)
React.memo
接受一个函数作为第二个参数来进行自定义道具比较。
默认情况下,它只会浅浅比较道具中的复杂对象 目的。如果您想控制比较,还可以提供 自定义比较函数作为第二个参数。
您可以像这样在util函数中使用它:
export const memoWithSecondParam = (Comp, deps = []) => {
return React.memo(Comp, (prevProps, nextProps) => {
return deps.every(d => prevProps[d] === nextProps[d])
});
};
并这样称呼它:
export default memoWithSecondParam(Todo, ["text"]);