React 中的 createRef和useRef

React 中的 createRef

在 React 中,createRef是一种用于访问在 render 方法中创建的 DOM 节点或 React 元素的方法。Refs 提供了一种与底层 DOM 元素交互的方式,它们在各种场景中都很有用,例如管理焦点、触发动画或集成第三方库。

createRef以下是有关如何在 React 中使用的分步指南:

  1. 初始化
    使用创建一个 ref 实例createRef并将其分配给类属性。

    class MyComponent extends React.Component {
        constructor(props) {
            super(props);
            this.myRef = React.createRef();
        }
    
  2. 附加到元素
    使用 prop 将 ref 实例附加到 React 元素ref

    render() {
        return <div ref={this.myRef}>Hello, World!</div>;
    }
    
  3. 访问 Ref
    将 ref 附加到元素后,您可以直接通过 访问该元素this.myRef.current

    componentDidMount() {
        console.log(this.myRef.current);  // This will log the <div> element to the console
    }
    
  4. 使用场景
    Refs 在各种场景下都很有用:

  • 管理焦点:安装组件时将焦点集中在输入元素上。
  • 触发动画:通过访问DOM元素,您可以使用GSAP等库来触发动画。
  • 集成第三方库:有时,您需要集成需要直接访问 DOM 的第三方库。参考文献可以在这里提供帮助。

5.要点

  • 避免使用 ref 来完成可以声明式完成的事情。例如,不要使用 refs 来“设置”子组件的属性,而是使用 props。
  • 当引用的内容发生变化时,不会触发重新渲染。它们只是访问 DOM 或 React 元素的一种方式。
  • 虽然您可以将 ref 分配给功能组件,但它需要用于forwardRef将 ref 传递给 DOM 元素。

请记住,虽然createRef很强大,但应谨慎使用。在许多情况下,您可以使用 React 的常用数据流机制以更具声明性的方式实现所需的行为。

React 中的 useRef(简单语言)

当然!useRef是 React 中的一个钩子函数,允许您访问 DOM 元素并与之交互,或者保留对值更改时不会触发重新渲染的可变引用。

简单说明:
假设您有一个实体笔记本,您可以在其中记下笔记。每次您进行更改时,此笔记本不会对您大喊大叫,但您可以在需要查看所写内容时随时回顾它。同样的,useRef就像这个笔记本一样。您可以跟踪某些事情,而无需整个房间(您的组件)在每次做笔记时都做出反应。

常见用例:

  1. 专注于输入字段。
  2. 计算元素的大小。
  3. 跟踪变量的先前状态/值,而不会导致重新渲染。

高级解释:

  1. 可变参考对象

    • useRef返回一个可变引用对象 ( { current: ... })。
    • current属性被初始化为传递的参数(initialValue),它可以是任何东西。它在组件的整个生命周期内保持不变。
    • 与使用状态变量不同useState,更改ref.current不会触发重新渲染。
  2. DOM 访问

    • ref当与元素上的属性结合使用时,它提供对 DOM 元素的直接访问。当与第三方库集成或执行诸如设置焦点或测量元素之类的任务时,这特别有用。
  3. 以前的值

    • 它可用于存储变量的先前值/状态。因为它不会导致更改时重新渲染,所以可以方便地检查以前的值与当前的值,而无需昂贵的重新渲染。
  4. 计时器和间隔

    • 使用useRef是保存对间隔或超时的引用的常见模式。这样,您可以稍后清除它们(就像useEffect清理一样)。
  5. 命令句柄

    • forwardRef与和结合使用useImperativeHandle,它允许父组件访问子组件的函数和值。对于父母需要直接调用子函数的罕见用例,这是一种更高级的模式。

访问 DOM 元素的示例:

function MyComponent() {
  const inputRef = useRef(null);

  const handleFocus = () => {
    inputRef.current.focus();
  };

  return (
    <>
      <input ref={inputRef} type="text" />
      <button onClick={handleFocus}>Focus the input</button>
    </>
  );
}

在此示例中,inputRef附加到输入字段,单击按钮时,输入字段将获得焦点。

请记住,虽然useRef很强大,但直接操作 DOM 违背了 React 的声明性本质。明智的做法是明智地使用它,并且仅在必要时使用它。

全部评论

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务