import React from "react";
import { useRecoilState } from "recoil";
import { Industry, industryState } from "../atoms/industriesAtoms";
const useIndustryData = () => {
const [industryStateValue, setIndustryStateValue] =
useRecoilState(industryState);
const onJoinOrLeaveIndustry = (industryData: Industry, isJoined: boolean) => {
// is the user signed in
// if not => open auth modal
if (isJoined) {
leaveIndustry(industryData.id);
return;
}
joinIndustry(industryData);
// onJoinOrLeaveIndustry;
};
const joinIndustry = (industryData: Industry) => {};
const leaveIndustry = (industryId: string) => {};
return (
// data and functions,
*industryStateValue,* onJoinOrLeaveIndustry
);
};
export default useIndustryData;
我正在一个react项目中处理上面的代码,在屏幕截图的第27行中,我收到了一个错误,即逗号操作符左侧未使用,没有副作用。ts(2695)。
我想了解为什么会出现此错误,以及如何解决此错误。
我发现了一个类似的问题here,但解决方案对我自己的情况没有帮助。
2条答案
按热度按时间cedebl8k1#
此代码:
等价于:
...因为
industryStateValue
是一个简单变量,所以计算它没有副作用。comma operator计算它的左操作数,抛出该值,再计算右操作数,然后将该值作为结果。如果你想同时返回这两个值,你必须把它们 Package 起来,当只有两个或三个这样的值时,通常把它们 Package 在一个数组中:
然后,使用钩子的代码可以解构为离散变量,就像处理
useState
或useRecoilState
一样:如果愿意,可以使用
{}
代替[]
,从而使用对象代替数组:那么使用它的代码将使用对象解构(
{}
代替[]
):对于少量值(比如说,三个或更少),通常的做法是使用
useState
和useRecoilState
这样的数组,因为调用者更容易控制它们要反构到的变量的名称。但是对于四个或更多的值,对象就更清晰了,因为当你进入那么多的值时,位置反构可能很难理解。下面是调用者在反构对象时如何使用不同的名称(如数组示例中的state
和handler
):v64noz0r2#
我不小心将新文件命名为
.ts
,而不是.tsx
,因此出现此错误。该文件中包含JSX,并导致linter(eslint)无法识别JS对象中的JSX是否有效。
一旦我将文件扩展名更改为
.tsx
,linter就平静下来,并将对象结构识别为有效。:)下面是一个简单的示例,说明在我的案例中触发错误的原因:
由于属性
asset
包含JSX,所以当文件扩展名为.ts
时,linter会发脾气。使用.tsx
时,一切都很好。当然,这是预期的行为,但我花了一分钟才意识到发生了什么--特别是因为我得到的错误并没有真正帮助查明问题所在。