【发布时间】:2021-06-10 10:51:16
【问题描述】:
TLDR - 在 ReactJs 中使用 Typescript 的这些导入有什么区别:
setState1: (numbers: number[]) => void,
setState2: Function
大家好,我最近遇到了(对我而言)在 React 上使用 Typescript 导入函数的奇怪行为。为了更好地解释它,我将放示例代码:
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
)
}
....
}
handleSettingState1 和 handleSettingState2 都是传递给子组件和从子组件设置的函数,saveChanges 是 FuncComp 内按钮的 onClick 函数,saveHandler 是从帮助文件导入的,它看起来像这样:
export const saveHandler = (
saveFunc: GqlMutationType,
setState1: (numbers: number[]) => void,
setState2: Function
) => {
saveFunc()
.then(() => {
setState1([]);
setState2([]);
})
.catch((err: AxiosError) => {
console.log(err);
});
};
如您所见,setState1 和 setState2 的导入方式不同。
现在的问题是,当我通过处理程序设置两个状态时 -> 执行保存(它应该在 then 回调中清除两个数组) -> 设置另一个值,state1 内部和外部都将为空 @ 987654332@ 作用域,而state2 在handleSettingState2 内将具有旧值,但在类作用域内为空。
我在子组件中跳过了handleSettingState2 和handleSettingState2 的实现,因为我认为这无关紧要,但如果它影响到我也可以提供。
【问题讨论】:
-
这里没有导入,这些只是类型定义。此外,类型定义和整个类型系统不会改变任何运行时行为。这两个函数是相同的,如果你得到不同的结果,那不是因为类型定义。
标签: javascript reactjs typescript methods react-functional-component