我正在构建一个react本机应用程序。我有一个父组件和一个子组件。子组件有一个按钮,其事件处理程序位于父组件中。在事件处理程序的末尾,我还必须更新子组件中的特定状态。因此,我使用父组件中的useRef
钩子来创建子组件的引用。现在,事件处理程序函数看起来如下所示
const handleJoin = async (community: TCommunity) => {
// ..........
childComponentRef.current.setIsDataManipulated(true);
// ..........
};
但是在setIsDataManipulated
中,我得到了一条红色的乱七八糟的线条,当我悬停在它上面时,会出现以下错误
Property 'setIsDataManipulated' does not exist on type 'FC<TChildrenProps>'
这肯定是因为类型记录无法知道子组件具有我试图更新的状态。目前,我只用道具类型而不是状态类型对子组件进行注释。我在网上搜索发现,当使用基于类的组件时,我可以传递第二个泛型类型(如React.Component<TProps, TState>
)来注释道具和状态。但是如何使用React.FC
来实现呢?
发布于 2021-03-30 09:02:33
,这必须是因为类型记录无法知道子组件具有我要更新的状态。
不,这是因为元素没有公开的方法/函数的名称,有以下几个原因:
ref将引用DOM元素..
setIsDataManipulated
函数,但它不会以任何方式公开给父组件.这不是TypeScript的问题(尽管TypeScript很早就指出了这一点),方法/函数实际上并不存在于childComponentRef.current
上。
如果希望父组件控制子组件中的状态,请不要将其子组件中的状态设置为子组件中的状态,而是将其子组件变为支柱。这就是道具:由它们提供给子组件的父组件控制的状态。如果子组件还必须告诉父组件需要更改,那么让父组件传递一个setter来使用它。
我在网上搜索,发现当我使用基于类的组件时,我可以传递第二个泛型类型,比如
React.Component<TProps, TState>
来注释道具和状态。但是如何使用React.FC
来做到这一点呢?
不,React.FC
(React.FunctionComponent
)只有一个类型参数,用于道具。它没有理由为state设置一个类型参数,因为它不会用于任何事情。使用React.Component
,状态类型参数确定组件的代码实例的state
属性,以便在class
组件中使用this.state
和this.setState
的代码可以被键入。但是,函数组件中的状态不是这样工作的。没有单一的状态对象。相反,在使用useState
时,可以直接定义每个国家成员的类型。
下面是一个示例:一个带有一个支柱和两个状态项的class
组件与一个具有相同的支柱和状态项的函数组件:
class ClassExample extends React.Component<{prop1: string}, {state1: number; state2: string | null}> {
constructor(props: {prop1: string}) {
super(props);
this.state = {
state1: 42, // If these weren't here, TypeScript
state2: null, // would warn they were missing, thanks
// to the state type argument
};
}
// ...
}
const FunctionExample: React.FC<{prop1: string}> = ({prop1}) => {
const [state1, setB] = useState(42); // TypeScript infers `number` for type
const [state2, setC] = useState<string | null>(null); // Explicit so TypeScript knows it's `string | null`
// ...
};
https://stackoverflow.com/questions/66867745
复制相似问题