Reactjs 在另一个函数中使用useCallback可以吗?
我有如下(TypeScript)代码:Reactjs 在另一个函数中使用useCallback可以吗?,reactjs,typescript,react-hooks,Reactjs,Typescript,React Hooks,我有如下(TypeScript)代码: export const DemoComponent = React.memo((props: DemoComponentProps) => { const [state1, setState1] = React.useState<string | undefined>(''); const [state2, setState2] = React.useState<string | undefined>('')
export const DemoComponent = React.memo((props: DemoComponentProps) => {
const [state1, setState1] = React.useState<string | undefined>('');
const [state2, setState2] = React.useState<string | undefined>('');
const createF = (b: boolean) => React.useCallback(() => {
/* code that does not depend on b or state2 */
doSomething({ param: 'param', param2: b ? undefined : state2 });
if (!b) setState2(/* some other value */);
}, b ? [state1] : [state1, state2]);
const f1 = createF(false);
const f2 = createF(true);
return (
/* a few components, some of which use f1, while others use f2 */
);
});
export const DemoComponent=React.memo((props:DemoComponentProps)=>{
const[state1,setState1]=React.useState(“”);
const[state2,setState2]=React.useState(“”);
const createF=(b:boolean)=>React.useCallback(()=>{
/*不依赖于b或state2的代码*/
doSomething({param:'param',param2:b?未定义:state2});
如果(!b)设置state2(/*其他值*/);
},b?[state1]:[state1,state2]);
常数f1=createF(false);
常数f2=createF(真);
返回(
/*一些组件,其中一些使用f1,而另一些使用f2*/
);
});
useCallback
在这里会像预期的那样工作吗(好像我只为f1
和f2
写了两次,并重写了所有使用b
的地方),还是会出问题呢?你不能像这样使用useCallback
不要从常规JavaScript函数调用钩子
- 来自React函数组件的调用挂钩
- 从自定义钩子调用钩子
react hooks/rules of hooks
在函数中调用了React挂钩“useCallback”。。。它既不是React函数组件,也不是自定义React钩子函数
为什么在组件级别使用React.memo?(记住:过早优化是万恶之源!我认为你不需要它……)。另外,
useCallback
本身是记忆化的,如果其道具不变,React组件将不会重新呈现。@Vinzzz基本上我们公司的政策是在任何地方使用memo。我是新来的(在我的公司),所以我不能真正挑战这种方法,即使我不想盲目做事。。。这种防御性编程(“到处使用X,因为……谁知道呢?安全总比抱歉好”)这是一个坏消息practice@Vinzzz我知道它是备忘录,我在问它的备忘录是否仍能正常工作,即使我不仅仅使用useCallback,而是将它包装在另一个文件中function@Vinzzz我知道我不应该过早地进行优化,但这份备忘录早在我之前就存在了,所以也许它是必要的。我只是用它来展示这家公司是如何进行优化的component实际上是创建的,您可以…它是被记忆的组件…它不会打破钩子规则:定义到组件中的钩子数组(state1、state2、callback)永远是最重要的same@Vinzzz你试过了吗?检查一下,还有eslint警告it@DennisVash谢谢你的页面,这正是我想要的。虽然我想我可以使用useCallback,正如我展示的那样,因为订单仍然是一样的。我不知道什么是“意味着。。。依我看,问题不在于顶级的React.memo
包装组件-这似乎很好。问题确实出在createF
定义上,它根据b
的不同,用不同的依赖项包装钩子useCallback
。我认为在这里,useCallback
应该被useMoom
所取代,它始终依赖于state1
和state2
。(所以你是对的:这个例子打破了hooks规则)@Vinzzz抱歉这是我的cat:P。不管怎样,这个代码在很多方面都不正确,我想我已经解释了原因。