{"id":1420,"date":"2024-06-02T23:05:06","date_gmt":"2024-06-02T23:05:06","guid":{"rendered":""},"modified":"2024-06-05T06:12:46","modified_gmt":"2024-06-04T22:12:46","slug":"react-%e4%b9%8b-refs-%e7%9a%84%e4%bd%bf%e7%94%a8%e5%92%8c-forwardref-%e7%9a%84%e6%ba%90%e7%a0%81%e8%a7%a3%e8%af%bb","status":"publish","type":"post","link":"https:\/\/www.lccc.top\/?p=1420","title":{"rendered":"React \u4e4b Refs \u7684\u4f7f\u7528\u548c forwardRef \u7684\u6e90\u7801\u89e3\u8bfb"},"content":{"rendered":"<td class=\"d-block comment-body markdown-body  js-comment-body\">\n<h2 dir=\"auto\">\u4e09\u79cd\u4f7f\u7528\u65b9\u5f0f<\/h2>\n<p dir=\"auto\">React \u63d0\u4f9b\u4e86 Refs\uff0c\u5e2e\u52a9\u6211\u4eec\u8bbf\u95ee DOM \u8282\u70b9\u6216\u5728 render \u65b9\u6cd5\u4e2d\u521b\u5efa\u7684 React \u5143\u7d20\u3002<\/p>\n<p dir=\"auto\">React \u63d0\u4f9b\u4e86\u4e09\u79cd\u4f7f\u7528 Ref \u7684\u65b9\u5f0f\uff1a<\/p>\n<h3 dir=\"auto\">1. String Refs<\/h3>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class App extends React.Component {\n    constructor(props) {\n        super(props)\n    }\n    componentDidMount() {\n        setTimeout(() =&gt; {\n             \/\/ 2. \u901a\u8fc7 this.refs.xxx \u83b7\u53d6 DOM \u8282\u70b9\n             this.refs.textInput.value = 'new value'\n        }, 2000)\n    }\n    render() {\n        \/\/ 1. ref \u76f4\u63a5\u4f20\u5165\u4e00\u4e2a\u5b57\u7b26\u4e32\n        return (\n            &lt;div&gt;\n              &lt;input ref=&quot;textInput&quot; value='value' \/&gt;\n            &lt;\/div&gt;\n        )\n    }\n}\n\nroot.render(&lt;App \/&gt;);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">class<\/span> <span class=\"pl-v\">App<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">setTimeout<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n             <span class=\"pl-c\">\/\/ 2. \u901a\u8fc7 this.refs.xxx \u83b7\u53d6 DOM \u8282\u70b9<\/span>\n             <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">refs<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInput<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'new value'<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2000<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c\">\/\/ 1. ref \u76f4\u63a5\u4f20\u5165\u4e00\u4e2a\u5b57\u7b26\u4e32<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n              <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">\"textInput\"<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">'value'<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-s1\">root<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">App<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">2. \u56de\u8c03 Refs<\/h3>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class App extends React.Component {\n    constructor(props) {\n        super(props)\n    }\n    componentDidMount() {\n        setTimeout(() =&gt; {\n              \/\/ 2. \u901a\u8fc7\u5b9e\u4f8b\u5c5e\u6027\u83b7\u53d6 DOM \u8282\u70b9\n              this.textInput.value = 'new value'\n        }, 2000)\n    }\n    render() {\n        \/\/ 1. ref \u4f20\u5165\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\n        \/\/ \u8be5\u51fd\u6570\u4e2d\u63a5\u53d7 React \u7ec4\u4ef6\u5b9e\u4f8b\u6216 DOM \u5143\u7d20\u4f5c\u4e3a\u53c2\u6570\n        \/\/ \u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u5176\u5b58\u50a8\u5230\u5177\u4f53\u7684\u5b9e\u4f8b\u5c5e\u6027\uff08this.textInput\uff09\n        return (\n            &lt;div&gt;\n              &lt;input ref={(element) =&gt; {\n                this.textInput = element;\n              }} value='value' \/&gt;\n            &lt;\/div&gt;\n        )\n    }\n}\n\nroot.render(&lt;App \/&gt;);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">class<\/span> <span class=\"pl-v\">App<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">setTimeout<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n              <span class=\"pl-c\">\/\/ 2. \u901a\u8fc7\u5b9e\u4f8b\u5c5e\u6027\u83b7\u53d6 DOM \u8282\u70b9<\/span>\n              <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInput<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'new value'<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2000<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c\">\/\/ 1. ref \u4f20\u5165\u4e00\u4e2a\u56de\u8c03\u51fd\u6570<\/span>\n        <span class=\"pl-c\">\/\/ \u8be5\u51fd\u6570\u4e2d\u63a5\u53d7 React \u7ec4\u4ef6\u5b9e\u4f8b\u6216 DOM \u5143\u7d20\u4f5c\u4e3a\u53c2\u6570<\/span>\n        <span class=\"pl-c\">\/\/ \u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u5176\u5b58\u50a8\u5230\u5177\u4f53\u7684\u5b9e\u4f8b\u5c5e\u6027\uff08this.textInput\uff09<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n              <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">element<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInput<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">element<\/span><span class=\"pl-kos\">;<\/span>\n              <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">'value'<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-s1\">root<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">App<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">3. createRef<\/h3>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class App extends React.Component {\n    constructor(props) {\n        super(props)\n        \/\/ 1. \u4f7f\u7528 createRef \u521b\u5efa Refs\n        \/\/ \u5e76\u5c06 Refs \u5206\u914d\u7ed9\u5b9e\u4f8b\u5c5e\u6027 textInputRef\uff0c\u4ee5\u4fbf\u5728\u6574\u4e2a\u7ec4\u4ef6\u4e2d\u5f15\u7528\n        this.textInputRef = React.createRef();\n    }\n    componentDidMount() {\n        setTimeout(() =&gt; {\n            \/\/ 3. \u901a\u8fc7 Refs \u7684 current \u5c5e\u6027\u8fdb\u884c\u5f15\u7528\n            this.textInputRef.current.value = 'new value'\n        }, 2000)\n    }\n    render() {\n        \/\/ 2. \u901a\u8fc7 ref \u5c5e\u6027\u9644\u52a0\u5230 React \u5143\u7d20\n        return (\n            &lt;div&gt;\n              &lt;input ref={this.textInputRef} value='value' \/&gt;\n            &lt;\/div&gt;\n        )\n    }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">class<\/span> <span class=\"pl-v\">App<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-c\">\/\/ 1. \u4f7f\u7528 createRef \u521b\u5efa Refs<\/span>\n        <span class=\"pl-c\">\/\/ \u5e76\u5c06 Refs \u5206\u914d\u7ed9\u5b9e\u4f8b\u5c5e\u6027 textInputRef\uff0c\u4ee5\u4fbf\u5728\u6574\u4e2a\u7ec4\u4ef6\u4e2d\u5f15\u7528<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInputRef<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">setTimeout<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-c\">\/\/ 3. \u901a\u8fc7 Refs \u7684 current \u5c5e\u6027\u8fdb\u884c\u5f15\u7528<\/span>\n            <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInputRef<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">current<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'new value'<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2000<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c\">\/\/ 2. \u901a\u8fc7 ref \u5c5e\u6027\u9644\u52a0\u5230 React \u5143\u7d20<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n              <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">'value'<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u662f\u6700\u88ab\u63a8\u8350\u4f7f\u7528\u7684\u65b9\u5f0f\u3002<\/p>\n<h2 dir=\"auto\">\u4e24\u79cd\u4f7f\u7528\u76ee\u7684<\/h2>\n<p dir=\"auto\">Refs \u9664\u4e86\u7528\u4e8e\u83b7\u53d6\u5177\u4f53\u7684 DOM \u8282\u70b9\u5916\uff0c\u4e5f\u53ef\u4ee5\u83b7\u53d6 Class \u7ec4\u4ef6\u7684\u5b9e\u4f8b\uff0c\u5f53\u83b7\u53d6\u5230\u5b9e\u4f8b\u540e\uff0c\u53ef\u4ee5\u8c03\u7528\u5176\u4e2d\u7684\u65b9\u6cd5\uff0c\u4ece\u800c\u5f3a\u5236\u6267\u884c\uff0c\u6bd4\u5982\u52a8\u753b\u4e4b\u7c7b\u7684\u6548\u679c\u3002<\/p>\n<p dir=\"auto\">\u6211\u4eec\u4e3e\u4e00\u4e2a\u83b7\u53d6\u7ec4\u4ef6\u5b9e\u4f8b\u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class Input extends React.Component {\n    constructor(props) {\n        super(props)\n        this.textInputRef = React.createRef();\n    }\n    handleFocus() {\n        this.textInputRef.current.focus();\n    }\n    render() {\n        return &lt;input ref={this.textInputRef} value='value' \/&gt;\n    }\n}\n\nclass App extends React.Component {\n    constructor(props) {\n        super(props)\n        this.inputRef = React.createRef();\n    }\n    componentDidMount() {\n        setTimeout(() =&gt; {\n                this.inputRef.current.handleFocus()\n        }, 2000)\n    }\n    render() {\n        return (\n            &lt;div&gt;\n              &lt;Input ref={this.inputRef} value='value' \/&gt;\n            &lt;\/div&gt;\n        )\n    }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Input<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInputRef<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">handleFocus<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInputRef<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">current<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">focus<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">textInputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">'value'<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">App<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">setTimeout<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">current<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">handleFocus<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2000<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n              <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">'value'<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u901a\u8fc7 <code class=\"notranslate\">this.inputRef.current<\/code> \u83b7\u53d6\u5230 Input \u7ec4\u4ef6\u7684\u5b9e\u4f8b\uff0c\u5e76\u8c03\u7528\u4e86\u5b9e\u4f8b\u7684 handleFocus \u65b9\u6cd5\uff0c\u5728\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\uff0c\u53c8\u901a\u8fc7 Refs \u83b7\u53d6\u5230\u5177\u4f53\u7684 DOM \u5143\u7d20\uff0c\u6267\u884c\u4e86 focus \u539f\u751f\u65b9\u6cd5\u3002<\/p>\n<h2 dir=\"auto\">forwardRef<\/h2>\n<p dir=\"auto\">\u6ce8\u610f\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u7684 Input \u7ec4\u4ef6\u4f7f\u7528\u7684\u662f\u7c7b\u7ec4\u4ef6\uff0cInput \u7ec4\u4ef6\u53ef\u4ee5\u6539\u4e3a\u4f7f\u7528\u51fd\u6570\u7ec4\u4ef6\u5417\uff1f<\/p>\n<p dir=\"auto\">\u7b54\u6848\u662f\u4e0d\u53ef\u4ee5\uff0c\u6211\u4eec\u4e0d\u80fd\u5728\u51fd\u6570\u7ec4\u4ef6\u4e0a\u4f7f\u7528 ref \u5c5e\u6027\uff0c\u56e0\u4e3a\u51fd\u6570\u7ec4\u4ef6\u6ca1\u6709\u5b9e\u4f8b\u3002<\/p>\n<p dir=\"auto\">\u5982\u679c\u6211\u4eec\u5f3a\u884c\u4f7f\u7528\uff0cReact \u4f1a\u62a5\u9519\u5e76\u63d0\u793a\u6211\u4eec\u7528 forwardRef\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function Input() {\n  return &lt;input value='value' \/&gt;\n}\n\nclass App extends React.Component {\n    constructor(props) {\n        super(props)\n        this.inputRef = React.createRef();\n    }\n    render() {\n        return (\n            &lt;div&gt;\n              &lt;Input ref={this.inputRef} value='value' \/&gt;\n            &lt;\/div&gt;\n        )\n    }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-v\">Input<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">'value'<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">App<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n              <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">'value'<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"\/\/www.lccc.top\/wp-content\/uploads\/pic\/mqyqingfen\/ed0d020365c2610e1e2c88937539b1f1e53a1c87.jpg\"><img decoding=\"async\" src=\"\/\/www.lccc.top\/wp-content\/uploads\/pic\/mqyqingfen\/ed0d020365c2610e1e2c88937539b1f1e53a1c87.jpg\" alt=\"image.png\" data-canonical-src=\"https:\/\/p3-juejin.byteimg.com\/tos-cn-i-k3u1fbpfcp\/bbd87f597dd04a8d82f1512fc88df339~tplv-k3u1fbpfcp-watermark.image?\" style=\"max-width: 100%;\"><\/a><\/p>\n<p dir=\"auto\">\u4f46\u662f\u5462\uff0c\u5bf9\u4e8e\u201c\u83b7\u53d6\u7ec4\u4ef6\u5b9e\u4f8b\uff0c\u8c03\u7528\u5b9e\u4f8b\u65b9\u6cd5\u201d\u8fd9\u4e2a\u9700\u6c42\uff0c\u5373\u4f7f\u4f7f\u7528 forwardRef \u4e5f\u505a\u4e0d\u5230\uff0c\u501f\u52a9 forwardRef \u540e\uff0c\u6211\u4eec\u4e5f\u5c31\u662f\u8ddf\u7c7b\u7ec4\u4ef6\u4e00\u6837\uff0c\u53ef\u4ee5\u5728\u7ec4\u4ef6\u4e0a\u4f7f\u7528 ref \u5c5e\u6027\uff0c\u7136\u540e\u5c06 ref \u7ed1\u5b9a\u5230\u5177\u4f53\u7684 DOM \u5143\u7d20\u6216\u8005 class \u7ec4\u4ef6\u4e0a\uff0c\u4e5f\u5c31\u662f\u6211\u4eec\u5e38\u8bf4\u7684 Refs \u8f6c\u53d1\u3002<\/p>\n<h2 dir=\"auto\">Refs \u8f6c\u53d1<\/h2>\n<p dir=\"auto\">\u6709\u7684\u65f6\u5019\uff0c\u6211\u4eec\u5f00\u53d1\u4e00\u4e2a\u7ec4\u4ef6\uff0c\u8fd9\u4e2a\u7ec4\u4ef6\u9700\u8981\u5bf9\u7ec4\u4ef6\u4f7f\u7528\u8005\u63d0\u4f9b\u4e00\u4e2a ref \u5c5e\u6027\uff0c\u7528\u4e8e\u8ba9\u7ec4\u4ef6\u4f7f\u7528\u8005\u83b7\u53d6\u5177\u4f53\u7684 DOM \u5143\u7d20\uff0c\u6211\u4eec\u5c31\u9700\u8981\u8fdb\u884c Refs \u8f6c\u53d1\uff0c\u6211\u4eec\u901a\u5e38\u7684\u505a\u6cd5\u662f\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u7c7b\u7ec4\u4ef6\nclass Child extends React.Component {\n    render() {\n        const {inputRef, ...rest} = this.props;\n        \/\/ 3. \u8fd9\u91cc\u5c06 props \u4e2d\u7684 inputRef \u8d4b\u7ed9 DOM \u5143\u7d20\u7684 ref\n        return &lt;input ref={inputRef} {...rest} placeholder=&quot;value&quot; \/&gt;\n    }\n}\n\/\/ \u51fd\u6570\u7ec4\u4ef6\nfunction Child(props) {\n      const {inputRef, ...rest} = props;\n      \/\/ 3. \u8fd9\u91cc\u5c06 props \u4e2d\u7684 inputRef \u8d4b\u7ed9 DOM \u5143\u7d20\u7684 ref\n      return &lt;input ref={inputRef} {...rest} placeholder=&quot;value&quot; \/&gt;\n}\n\nclass Parent extends React.Component {\n    constructor(props) {\n        super(props)\n        \/\/ 1. \u521b\u5efa refs\n        this.inputRef = React.createRef();\n    }\n    componentDidMount() {\n        setTimeout(() =&gt; {\n            \/\/ 4. \u4f7f\u7528 this.inputRef.current \u83b7\u53d6\u5b50\u7ec4\u4ef6\u4e2d\u6e32\u67d3\u7684 DOM \u8282\u70b9\n            this.inputRef.current.value = 'new value'\n        }, 2000)\n    }\n    render() {\n        \/\/ 2. \u56e0\u4e3a ref \u5c5e\u6027\u4e0d\u80fd\u901a\u8fc7 this.props \u83b7\u53d6\uff0c\u6240\u4ee5\u8fd9\u91cc\u6362\u4e86\u4e00\u4e2a\u5c5e\u6027\u540d\n        return &lt;Child inputRef={this.inputRef} \/&gt;\n    }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7c7b\u7ec4\u4ef6<\/span>\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Child<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">const<\/span> <span class=\"pl-kos\">{<\/span>inputRef<span class=\"pl-kos\">,<\/span> ...<span class=\"pl-s1\">rest<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">props<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-c\">\/\/ 3. \u8fd9\u91cc\u5c06 props \u4e2d\u7684 inputRef \u8d4b\u7ed9 DOM \u5143\u7d20\u7684 ref<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-s1\">inputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-kos\">{<\/span>...<span class=\"pl-s1\">rest<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">placeholder<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">\"value\"<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-c\">\/\/ \u51fd\u6570\u7ec4\u4ef6<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-v\">Child<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">const<\/span> <span class=\"pl-kos\">{<\/span>inputRef<span class=\"pl-kos\">,<\/span> ...<span class=\"pl-s1\">rest<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-c\">\/\/ 3. \u8fd9\u91cc\u5c06 props \u4e2d\u7684 inputRef \u8d4b\u7ed9 DOM \u5143\u7d20\u7684 ref<\/span>\n      <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-s1\">inputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-kos\">{<\/span>...<span class=\"pl-s1\">rest<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">placeholder<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">\"value\"<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Parent<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-c\">\/\/ 1. \u521b\u5efa refs<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">setTimeout<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-c\">\/\/ 4. \u4f7f\u7528 this.inputRef.current \u83b7\u53d6\u5b50\u7ec4\u4ef6\u4e2d\u6e32\u67d3\u7684 DOM \u8282\u70b9<\/span>\n            <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">current<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'new value'<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2000<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c\">\/\/ 2. \u56e0\u4e3a ref \u5c5e\u6027\u4e0d\u80fd\u901a\u8fc7 this.props \u83b7\u53d6\uff0c\u6240\u4ee5\u8fd9\u91cc\u6362\u4e86\u4e00\u4e2a\u5c5e\u6027\u540d<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Child<\/span> <span class=\"pl-c1\">inputRef<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">React \u63d0\u4f9b\u4e86 forwardRef \u8fd9\u4e2a API\uff0c\u6211\u4eec\u76f4\u63a5\u770b\u4f7f\u7528\u793a\u4f8b\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ 3. \u5b50\u7ec4\u4ef6\u901a\u8fc7 forwardRef \u83b7\u53d6 ref\uff0c\u5e76\u901a\u8fc7 ref \u5c5e\u6027\u7ed1\u5b9a React \u5143\u7d20\nconst Child = forwardRef((props, ref) =&gt; (\n  &lt;input ref={ref} placeholder=&quot;value&quot; \/&gt;\n));\n\nclass Parent extends React.Component {\n    constructor(props) {\n        super(props)\n        \/\/ 1. \u521b\u5efa refs\n        this.inputRef = React.createRef();\n    }\n    componentDidMount() {\n        setTimeout(() =&gt; {\n            \/\/ 4. \u4f7f\u7528 this.inputRef.current \u83b7\u53d6\u5b50\u7ec4\u4ef6\u4e2d\u6e32\u67d3\u7684 DOM \u8282\u70b9\n            this.inputRef.current.value = 'new value'\n        }, 2000)\n    }\n    render() {\n        \/\/ 2. \u4f20\u7ed9\u5b50\u7ec4\u4ef6\u7684 ref \u5c5e\u6027\n        return &lt;Child ref={this.inputRef} \/&gt;\n    }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ 3. \u5b50\u7ec4\u4ef6\u901a\u8fc7 forwardRef \u83b7\u53d6 ref\uff0c\u5e76\u901a\u8fc7 ref \u5c5e\u6027\u7ed1\u5b9a React \u5143\u7d20<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-v\">Child<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">forwardRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">ref<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">(<\/span>\n  <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-s1\">ref<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">placeholder<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">\"value\"<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Parent<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-c\">\/\/ 1. \u521b\u5efa refs<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">setTimeout<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-c\">\/\/ 4. \u4f7f\u7528 this.inputRef.current \u83b7\u53d6\u5b50\u7ec4\u4ef6\u4e2d\u6e32\u67d3\u7684 DOM \u8282\u70b9<\/span>\n            <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">current<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'new value'<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2000<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c\">\/\/ 2. \u4f20\u7ed9\u5b50\u7ec4\u4ef6\u7684 ref \u5c5e\u6027<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-v\">Child<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">inputRef<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5c24\u5176\u662f\u5728\u6211\u4eec\u7f16\u5199\u9ad8\u9636\u7ec4\u4ef6\u7684\u65f6\u5019\uff0c\u5f80\u5f80\u8981\u5b9e\u73b0 refs \u8f6c\u53d1\u3002\u6211\u4eec\u77e5\u9053\uff0c\u4e00\u4e2a\u9ad8\u9636\u7ec4\u4ef6\uff0c\u4f1a\u63a5\u53d7\u4e00\u4e2a\u7ec4\u4ef6\uff0c\u8fd4\u56de\u4e00\u4e2a\u5305\u88f9\u540e\u7684\u65b0\u7ec4\u4ef6\uff0c\u4ece\u800c\u5b9e\u73b0\u67d0\u79cd\u529f\u80fd\u7684\u589e\u5f3a\u3002<\/p>\n<p dir=\"auto\">\u4f46\u4e5f\u6b63\u662f\u5982\u6b64\uff0c\u6211\u4eec\u6dfb\u52a0 ref\uff0c\u83b7\u53d6\u7684\u4f1a\u662f\u5305\u88f9\u540e\u7684\u65b0\u7ec4\u4ef6\u7684\u5b9e\u4f8b\uff0c\u800c\u975e\u88ab\u5305\u88f9\u7684\u7ec4\u4ef6\u5b9e\u4f8b\uff0c\u8fd9\u5c31\u53ef\u80fd\u4f1a\u5bfc\u81f4\u4e00\u4e9b\u95ee\u9898\u3002<\/p>\n<h2 dir=\"auto\">createRef \u6e90\u7801<\/h2>\n<p dir=\"auto\">\u73b0\u5728\u6211\u4eec\u770b\u4e0b <code class=\"notranslate\">createRef<\/code> \u7684\u6e90\u7801\uff0c<a href=\"https:\/\/github.com\/facebook\/react\/blob\/main\/packages\/react\/src\/ReactCreateRef.js\">\u6e90\u7801\u7684\u4f4d\u7f6e<\/a>\u5728 <code class=\"notranslate\">\/packages\/react\/src\/ReactCreateRef.js<\/code>\uff0c\u4ee3\u7801\u5176\u5b9e\u5f88\u7b80\u5355\uff0c\u5c31\u53ea\u662f\u8fd4\u56de\u4e86\u4e00\u4e2a\u5177\u6709 current \u5c5e\u6027\u7684\u5bf9\u8c61\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u7b80\u5316\u540e\nexport function createRef() {\n  const refObject = {\n    current: null,\n  };\n  return refObject;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b80\u5316\u540e<\/span>\n<span class=\"pl-k\">export<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">refObject<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">current<\/span>: <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">refObject<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u6e32\u67d3\u7684\u8fc7\u7a0b\u4e2d\uff0c<code class=\"notranslate\">refObject.current<\/code> \u4f1a\u88ab\u8d4b\u4e88\u5177\u4f53\u7684\u503c\u3002<\/p>\n<h2 dir=\"auto\">forwardRef \u6e90\u7801<\/h2>\n<p dir=\"auto\">\u90a3 forwardRef \u6e90\u7801\u5462\uff1f<a href=\"https:\/\/github.com\/facebook\/react\/blob\/main\/packages\/react\/src\/ReactForwardRef.js\">\u6e90\u7801\u7684\u4f4d\u7f6e<\/a>\u5728 <code class=\"notranslate\">\/packages\/react\/src\/ReactForwardRef.js<\/code>\uff0c\u4ee3\u7801\u4e5f\u5f88\u7b80\u5355\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u7b80\u5316\u540e\nconst REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\n\nexport function forwardRef(render) {\n  const elementType = {\n    $$typeof: REACT_FORWARD_REF_TYPE,\n    render,\n  };\n\n  return elementType;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7b80\u5316\u540e<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-c1\">REACT_FORWARD_REF_TYPE<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Symbol<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">for<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">'react.forward_ref'<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">export<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">forwardRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">render<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">elementType<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">$$typeof<\/span>: <span class=\"pl-c1\">REACT_FORWARD_REF_TYPE<\/span><span class=\"pl-kos\">,<\/span>\n    render<span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">elementType<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4f46\u662f\u8981\u6ce8\u610f\u8fd9\u91cc\u7684 <code class=\"notranslate\">$$typeof<\/code>\uff0c\u5c3d\u7ba1\u8fd9\u91cc\u662f <code class=\"notranslate\">REACT_FORWARD_REF_TYPE<\/code>\uff0c\u4f46\u6700\u7ec8\u521b\u5efa\u7684 React \u5143\u7d20\u7684 <code class=\"notranslate\">$$typeof<\/code> \u4f9d\u7136\u4e3a <code class=\"notranslate\">REACT_ELEMENT_TYPE<\/code>\u3002<\/p>\n<p dir=\"auto\">\u5173\u4e8e <code class=\"notranslate\">createElement<\/code> \u7684\u6e90\u7801\u5206\u6790\u53c2\u8003 <a href=\"https:\/\/juejin.cn\/post\/7160981608885927972\" rel=\"nofollow\">\u300aReact \u4e4b createElement \u6e90\u7801\u89e3\u8bfb\u300b<\/a>\uff0c\u6211\u4eec\u8fd9\u91cc\u7b80\u5355\u5206\u6790\u4e00\u4e0b\uff0c\u4ee5 <code class=\"notranslate\">InputComponent<\/code> \u4e3a\u4f8b\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='\/\/ \u4f7f\u7528 forwardRef\nconst InputComponent = forwardRef(({value}, ref) =&gt; (\n  &lt;input ref={ref} className=\"FancyButton\" value={value} \/&gt;\n));\n\n\/\/ \u6839\u636e forwardRef \u7684\u6e90\u7801\uff0c\u6700\u7ec8\u8fd4\u56de\u7684\u5bf9\u8c61\u683c\u5f0f\u4e3a\uff1a\nconst InputComponent = {\n    $$typeof: REACT_FORWARD_REF_TYPE,\n    render,\n}\n\n\/\/ \u4f7f\u7528\u7ec4\u4ef6\nconst result = &lt;InputComponent \/&gt;\n  \n\/\/ Bable \u5c06\u5176\u8f6c\u8bd1\u4e3a\uff1a\nconst result = React.createElement(InputComponent, null);\n\n\/\/ \u6700\u7ec8\u8fd4\u56de\u7684\u5bf9\u8c61\u4e3a\uff1a\nconst result = {\n  $$typeof: REACT_ELEMENT_TYPE,\n  type: {\n    $$typeof: REACT_FORWARD_REF_TYPE,\n    render,\n  }\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u4f7f\u7528 forwardRef<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-v\">InputComponent<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">forwardRef<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>value<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">ref<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">(<\/span>\n  <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">input<\/span> <span class=\"pl-c1\">ref<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-s1\">ref<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">className<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-s\">\"FancyButton\"<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-s1\">value<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ \u6839\u636e forwardRef \u7684\u6e90\u7801\uff0c\u6700\u7ec8\u8fd4\u56de\u7684\u5bf9\u8c61\u683c\u5f0f\u4e3a\uff1a<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-v\">InputComponent<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">$$typeof<\/span>: <span class=\"pl-c1\">REACT_FORWARD_REF_TYPE<\/span><span class=\"pl-kos\">,<\/span>\n    render<span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c\">\/\/ \u4f7f\u7528\u7ec4\u4ef6<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">result<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-v\">InputComponent<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n  \n<span class=\"pl-c\">\/\/ Bable \u5c06\u5176\u8f6c\u8bd1\u4e3a\uff1a<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">result<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createElement<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-v\">InputComponent<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ \u6700\u7ec8\u8fd4\u56de\u7684\u5bf9\u8c61\u4e3a\uff1a<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">result<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">$$typeof<\/span>: <span class=\"pl-c1\">REACT_ELEMENT_TYPE<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">type<\/span>: <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">$$typeof<\/span>: <span class=\"pl-c1\">REACT_FORWARD_REF_TYPE<\/span><span class=\"pl-kos\">,<\/span>\n    render<span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u5c1d\u8bd5\u7740\u6253\u5370\u4e00\u4e0b\u6700\u7ec8\u8fd4\u56de\u7684\u5bf9\u8c61\uff0c\u786e\u5b9e\u4e5f\u662f\u8fd9\u6837\u7684\u7ed3\u6784\uff1a<\/p>\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"\/\/www.lccc.top\/wp-content\/uploads\/pic\/mqyqingfen\/006856241352d52de0b3f480597c4839b15e2ffa.jpg\"><img decoding=\"async\" src=\"\/\/www.lccc.top\/wp-content\/uploads\/pic\/mqyqingfen\/006856241352d52de0b3f480597c4839b15e2ffa.jpg\" alt=\"image.png\" data-canonical-src=\"https:\/\/p3-juejin.byteimg.com\/tos-cn-i-k3u1fbpfcp\/810744b5369b4dd99e7cf6888c10f3bf~tplv-k3u1fbpfcp-zoom-1.image\" style=\"max-width: 100%;\"><\/a><\/p>\n<h2 dir=\"auto\">React \u7cfb\u5217<\/h2>\n<p dir=\"auto\">\u8bb2\u89e3 React \u6e90\u7801\u3001React API \u80cc\u540e\u7684\u5b9e\u73b0\u673a\u5236\uff0cReact \u6700\u4f73\u5b9e\u8df5\u3001React \u7684\u53d1\u5c55\u4e0e\u5386\u53f2\u7b49\uff0c\u9884\u8ba1 50 \u7bc7\u5de6\u53f3\uff0c\u6b22\u8fce\u5173\u6ce8<\/p>\n<p dir=\"auto\">\u5982\u679c\u559c\u6b22\u6216\u8005\u6709\u6240\u542f\u53d1\uff0c\u6b22\u8fce star\uff0c\u5bf9\u4f5c\u8005\u4e5f\u662f\u4e00\u79cd\u9f13\u52b1\u3002<\/p>\n<\/td>\n<p>\u6587\u7ae0\u8f6c\u8f7d\u81ea<a href='https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/318'>https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/318<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e09\u79cd\u4f7f\u7528\u65b9\u5f0f React \u63d0\u4f9b\u4e86 Refs\uff0c\u5e2e\u52a9\u6211\u4eec\u8bbf\u95ee DOM \u8282\u70b9\u6216\u5728 render \u65b9\u6cd5\u4e2d\u521b\u5efa\u7684 React \u5143\u7d20\u3002 React \u63d0\u4f9b\u4e86\u4e09\u79cd\u4f7f\u7528 Ref &#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.lccc.top\/?p=1420\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1420","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1420"}],"collection":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1420"}],"version-history":[{"count":1,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1420\/revisions"}],"predecessor-version":[{"id":2394,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1420\/revisions\/2394"}],"wp:attachment":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}