简体   繁体   English

使用 Typescript 导入函数

[英]Importing functions using Typescript

TLDR - what's the difference between these imports in ReactJs using Typescript: TLDR - 使用 Typescript 在 ReactJs 中的这些导入有什么区别:

setState1: (numbers: number[]) => void,
setState2: Function

Hi peeps, I've recently came across weird(for me) behaviour of importing functions using Typescript on React.嗨,窥视,我最近遇到了奇怪的(对我来说)在 React 上使用 Typescript 导入函数的行为。 To explain it better I'll just put sample code:为了更好地解释它,我将放置示例代码:

const FuncComp: React.FC = () => {
   const [state1, setState1] = useState<number[]>([]);
   const [state2, setState2] = useState<number[]>([]);

   const handleSettingState1 = () => {
       console.log("state1-",state1);
       setState1([...state1, 1]);
   }
   console.log("state1-",state1);

   const handleSettingState2 = () => {
       console.log("state2-",state2);
       setState1([...state2, 2]);
   }
   console.log("state2-",state2);

   const saveChanges = () => {
       saveHandler(
          saveFunc,
          setState1,
          setState2
       )
   }
....
}

both handleSettingState1 and handleSettingState2 are functions passed to and set from child components, saveChanges is onClick function of button inside FuncComp and saveHandler is imported from helper file and it looks like this: handleSettingState1handleSettingState2都是传递给子组件和从子组件设置的函数, saveChanges是 onClick function 的FuncCompsaveHandler是从帮助文件导入的,它看起来像这样:

export const saveHandler = (
    saveFunc: GqlMutationType,
    setState1: (numbers: number[]) => void,
    setState2: Function
) => {
    saveFunc()
        .then(() => {
            setState1([]);
            setState2([]);
        })
        .catch((err: AxiosError) => {
            console.log(err);
        });
};

As you can see setState1 and setState2 are imported differently.如您所见, setState1setState2的导入方式不同。 Now the problem is that when I set both states through handlers -> perform save(it should clear both arrays in then callback) -> set another value, state1 will be empty both inside and outside handleSettingState1 scope, while state2 will have old value inside handleSettingState2 but empty inside the scope of the class.现在的问题是,当我通过处理程序设置两个状态时->执行保存(它应该回调中清除 arrays)->设置另一个值, state1内部和外部都将为空handleSettingState1 scope,而state2内部将有旧值handleSettingState2但在 class 的 scope 内部为空。

I skipped implementation of handleSettingState2 and handleSettingState2 inside child component because I thought it's irrelevant but if it affects I can provide it too.我在子组件中跳过了handleSettingState2handleSettingState2的实现,因为我认为它无关紧要,但如果它影响到我也可以提供它。

You can update the save handler like so.您可以像这样更新保存处理程序。

export const saveHandler = (
    saveFunc: GqlMutationType,
    cb: (data: any) => void
) => {
    saveFunc()
        .then(data => cb(data))
        .catch((err: AxiosError) => {
            console.log(err);
        });
};

Importing and calling the function导入和调用function

import { saveHandler } from './filename';
...
...
function saveFn() {}

saveHandler(saveFn, (data) => {
   setState([...data]);
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM