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

相关推荐
zimoyin4 分钟前
Stoplight Elements WebComponents 原生 WEB 组件化技术生成 Swagger优美界面
前端
Irene19918 分钟前
Python 面向对象总结:对比 JavaScript 的面向对象
javascript·python·面向对象
zhensherlock13 分钟前
Protocol Launcher 系列:Working Copy 提交与同步全攻略
javascript·git·typescript·node.js·自动化·github·js
天若有情67313 分钟前
【开源推荐】form-validator-cn 轻量级中文表单校验库 | TS 零依赖、极简开箱即用
前端·npm·开源·node·js·表单校验
shjita31 分钟前
maven涉及的配置
java·前端·maven
changshuaihua00137 分钟前
useState 状态管理
开发语言·前端·javascript·react.js
鹏程十八少43 分钟前
6. 2026金三银四 面试官最爱的 Binder:一次拷贝、Activity 启动流程,这篇全搞定
前端·面试·前端框架
知识分享小能手1 小时前
ECharts入门学习教程,从入门到精通,综合实战——ECharts数据大屏 - 完整知识点(9)
前端·学习·echarts
是吗乔治1 小时前
vuetify实现excel表格粘贴效果
前端·vue.js·vue·excel
Java后端的Ai之路1 小时前
React 快速入门到精通教程:从零基础到能写项目
前端·react.js·前端框架