3.react useRef使用与常见问题

react useRef使用与常见问题

文章目录

  • [react useRef使用与常见问题](#react useRef使用与常见问题)
    • [1. Dom操作: useRef()](#1. Dom操作: useRef())
    • [2. 函数组件的转发: React.forwardRef()](#2. 函数组件的转发: React.forwardRef())
    • [3. 对普通值进行记忆, 类似于一个class的实例属性](#3. 对普通值进行记忆, 类似于一个class的实例属性)
    • [4. 结合useEffect,只在更新时触发](#4. 结合useEffect,只在更新时触发)
    • FAQ

1. Dom操作: useRef()

js 复制代码
    // 1. Dom操作: useRef()
    let app = document.querySelector('#app');
    let root = ReactDOM.createRoot(app);
    let { useState, useEffect, useRef } = React;
    
    let Welcome = (props) => {
      const myRef = useRef()

      const handleClick = () =>{
        myRef.current.focus()
      }
  
      return (
        <div>
          <button onClick={handleClick}>点击</button>
          <input ref={myRef} type='text' />
        </div>
      );
    }
    
    let element = (
      <Welcome />
    );
    root.render(element);

2. 函数组件的转发: React.forwardRef()

js 复制代码
      // 2. 函数组件的转发: React.forwardRef()
    let app = document.querySelector('#app');
    let root = ReactDOM.createRoot(app);
    let { useState, useEffect, useRef, forwardRef } = React;
    
    let Head = forwardRef((props, ref)=> {
      return (
        <div>
          hello Head
          {/*将 ref 转发到子组件的input上 */}
          <input ref={ref} type='text' />
      </div>
      )
    })

    let Welcome = (props) => {
      const myRef = useRef()

      const handleClick = () =>{
        // 点击时候会触发子组件的focus事件
        myRef.current.focus()
      }
  
      return (
        <div>
          <button onClick={handleClick}>点击</button>
          {/*ref 和组件关联*/}
          <Head ref={myRef}></Head>
        </div>
      );
    }
    
    let element = (
      <Welcome />
    );
    root.render(element);

3. 对普通值进行记忆, 类似于一个class的实例属性

js 复制代码
 // 3. 对普通值进行记忆, 类似于一个class的实例属性
    let app = document.querySelector('#app');
    let root = ReactDOM.createRoot(app);
    let { useState, useEffect, useRef } = React;
    

    let Welcome = (props) => {
      // 响应式数据,具有记忆功能,点击后响应式数据加1
      const [num, setNum] = useState(0);

      // let count = 0; // 普通的count不具有记忆功能
      const count = useRef(0) // 可以给普通值进行记忆操作

      const handleClick = () =>{
        count.current++;
        console.log(count.current);
        
        setNum(num + 1)

        // console.log(num); // 还是之前的值

      }
  
      return (
        <div>
          <button onClick={handleClick}>点击</button>
        
        </div>
      );
    }
    
    let element = (
      <Welcome />
    );
    root.render(element);

4. 结合useEffect,只在更新时触发

js 复制代码
 // 4. 结合useEffect,只在更新时触发
    let app = document.querySelector('#app');
    let root = ReactDOM.createRoot(app);
    let { useState, useEffect, useRef } = React;
    

    let Welcome = (props) => {
      // 响应式数据,具有记忆功能,点击后响应式数据加1
      const [num, setNum] = useState(0);

      const isUpdate = useRef(false) 

      useEffect(()=>{// 只在点击时候触发
       if (isUpdate.current) {
        console.log(num);
       }
      })

      const handleClick = () =>{
        setNum(num + 1)
        isUpdate.current = true

        // console.log(num); // 还是之前的值

      }
  
      return (
        <div>
          <button onClick={handleClick}>点击</button>
        
        </div>
      );
    }
    
    let element = (
      <Welcome />
    );
    root.render(element);

FAQ

https://zh-hans.legacy.reactjs.org/docs/hooks-faq.html#why-am-i-seeing-stale-props-or-state-inside-my-function

相关推荐
代码搬运媛8 小时前
Jest 测试框架详解与实现指南
前端
counterxing9 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq9 小时前
windows下nginx的安装
linux·服务器·前端
之歆9 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜9 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108089 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
candyTong10 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
kyriewen11 小时前
产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
前端·ai编程·cursor
humcomm12 小时前
元框架的工作原理详解
前端·前端框架
canonical_entropy12 小时前
Attractor Before Harness: AI 大规模开发的方法论
前端·aigc·ai编程