function usePersistFn(fn) {
var fnRef = react_1.useRef(fn);
fnRef.current = fn;
var persistFn = react_1.useRef();
if (!persistFn.current) {
persistFn.current = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return fnRef.current.apply(this, args);
};
}
return persistFn.current;
}
怎么解读 usePersistFn
函数?
就拿umi官方的例子来说明,有如下代码
首先我们得明白什么情况下会导致函数组件的重新渲染,有三种情况
很明显我们要谈论的情况属于第一种Props不严格相等,由于每次更新是
count
都会变化所以showCountCommon总是返回本次更新时创建的函数,所以在这种情况下useCallback
没什么卵用,所以我们把他简写成等价的代码,这也就是他每次都重新渲染的原因,因为Props每次都不能严格相等而
usePersistFn
则另辟蹊径,既然showCount不得不为了在闭包中捕获最新的count值而每次都指向新创建的函数导致前后Props不能严格相等,那么我干脆不把showCount作为Props传给子组件了,我在创建一个引用地址永不会变的函数传给子组件让子组件的Props每次都能严格相等,然后再在这个引用不会变的函数里捕获了指向该showCount函数的引用,所以只需要在showCount函数更新时把这个引用里面的showCount地址变更就行,而因为usePersistFn里面拥有showCount的ref每次执行时他总是能执行最新的showCount函数,详情看下面的注释