首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用道具和状态注释一个反应性功能组件?

如何用道具和状态注释一个反应性功能组件?
EN

Stack Overflow用户
提问于 2021-03-30 08:56:11
回答 1查看 590关注 0票数 1

我正在构建一个react本机应用程序。我有一个父组件和一个子组件。子组件有一个按钮,其事件处理程序位于父组件中。在事件处理程序的末尾,我还必须更新子组件中的特定状态。因此,我使用父组件中的useRef钩子来创建子组件的引用。现在,事件处理程序函数看起来如下所示

代码语言:javascript
运行
复制
const handleJoin = async (community: TCommunity) => {
    // ..........
    childComponentRef.current.setIsDataManipulated(true);
    // ..........
};

但是在setIsDataManipulated中,我得到了一条红色的乱七八糟的线条,当我悬停在它上面时,会出现以下错误

代码语言:javascript
运行
复制
Property 'setIsDataManipulated' does not exist on type 'FC<TChildrenProps>'

这肯定是因为类型记录无法知道子组件具有我试图更新的状态。目前,我只用道具类型而不是状态类型对子组件进行注释。我在网上搜索发现,当使用基于类的组件时,我可以传递第二个泛型类型(如React.Component<TProps, TState> )来注释道具和状态。但是如何使用React.FC来实现呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.statethis.setState的代码可以被键入。但是,函数组件中的状态不是这样工作的。没有单一的状态对象。相反,在使用useState时,可以直接定义每个国家成员的类型。

下面是一个示例:一个带有一个支柱和两个状态项的class组件与一个具有相同的支柱和状态项的函数组件:

代码语言:javascript
运行
复制
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`

    // ...
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66867745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档