代码之家  ›  专栏  ›  技术社区  ›  nammae88

React访问其他组件DOM节点

  •  1
  • nammae88  · 技术社区  · 6 月前

    在阅读react.dev学习教程时,我注意到访问另一个组件DOM节点有些不太正确。

    https://react.dev/learn/manipulating-the-dom-with-refs#accessing-another-components-dom-nodes

    如上述URL所述

    但是,如果您试图在自己的组件上放置一个ref,例如<MyInput/>;,默认情况下,您将得到null。这里有一个示例来演示它。请注意,单击按钮不会聚焦输入:

    如果我在沙箱中运行该示例,则不会出现关于无法为函数组件提供引用的警告。

    代码正常运行,输入获得了焦点。

    我甚至下载了沙箱并在本地开发环境中运行,但得到了相同的结果。

    我猜测ref属性被视为一个普通的道具,它被发送到MyInput组件并被销毁,成为<输入>。

    它与以下代码相同

    import { useRef } from "react";
    
    function MyInput({myCustomRef}) {
      return (
        <>
          <label>Name:</label>
          <input ref={myCustomRef} />
        </>
      );
    }
    
    export default function MyForm() {
      const inputRef = useRef(null);
    
      function handleClick() {
        inputRef.current.focus();
      }
    
      return (
        <>
          <MyInput myCustomRef={inputRef} />
          <button onClick={handleClick}>Focus the input</button>
        </>
      );
    }
    
    

    但如果是这样,那就意味着教程是错误的,考虑到教程其余部分的高质量,这是出乎意料的。

    1 回复  |  直到 6 月前
        1
  •  0
  •   Nick Parsons Felix Kling    6 月前

    这是因为沙箱现在运行的是React 19(于2024年12月5日发布),其中 forwardRef 不再需要,并使用 ref prop now works :

    新的函数组件将不再需要forwardRef,我们将发布一个codemod来自动更新您的组件以使用新的ref prop。在未来的版本中,我们将弃用并删除forwardRef。

    因此,React文档的这一部分似乎还没有更新以反映新的行为,因为它仍然在谈论运行React 18及更低版本时会看到的行为。

    因此,如果你使用的是React 19,那么你可以忽略这一部分,而是按照他们对 裁判 React 19更改日志中的prop:

    从React 19开始,您现在可以将ref作为函数的道具访问 组件:

    function MyInput({placeholder, ref}) {   
      return <input placeholder={placeholder} ref={ref} /> 
    }
    
    //... <MyInput ref={ref} />