微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数组件的响应引用,无法获取引用:“函数组件不能被赋予引用”

如何解决函数组件的响应引用,无法获取引用:“函数组件不能被赋予引用”

我正在构建一个带有 fluentui/react-nothstar 包控件的 React 网站。您可以在下面找到文本 + 按钮的简化示例。我的方案是在按下按钮时访问文本控件。我需要类似 document.findElementById 的东西,它通过 refs in React 工作。它适用于组件控件(扩展 React.Component),但对于 northstar 组件失败并出现错误

Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

根据警告详细信息和 Text 控件定义,它看起来像是一个函数组件,我必须使用 React forwardRef 来访问它的属性。我尝试了多种方法来执行此操作 hereherehere,但都没有成功。

import React from 'react';
import {
    Text,Button,}
    from '@fluentui/react-northstar';

class Welcome extends React.Component {

    private textRef: any = React.createRef();

    private doJob1() {
        console.log("doJob1 executed");
        console.log(this.textRef.current); // returns null
    }

    render() {
        return (
            <div>
                <div>Welcome</div>
                <div>
                    <Text
                        ref={this.textRef}
                        content="My fancy text control" />
                    <Button
                        onClick={this.doJob1.bind(this)}
                        content="My fancy button" />

                </div>
            </div>
        );
    }
}

export default Welcome;

在大多数情况下,我可以通过使用 props 和 state 来避免直接访问元素,但在某些情况下,我仍然需要一个组件引用(更改焦点、打开对话框、更新未在我的状态中定义的值)。

在上面的示例中,访问 Button 单击处理程序中的 Text 控件的正确方法是什么?

解决方法

在这种情况下,图书馆需要转发引用 which apparently they don't

但一般来说,您希望使用 controlled components 来捕获这样的用户输入。基本上,您需要设置一个变量来跟踪父组件中的值(欢迎,在您的情况下),将其作为 value 传递给 <Text /> 组件并从其 {{ 1}}。然后,在按钮的 onChange 上,无论用户输入是什么,该值都将是最新的。

,

原来 Ref 就是为此而设计的:

<Ref innerRef={this.textRef}>
    <Text content="My fancy text control" />
</Ref>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。