当前位置: 首页 > news >正文

3.react useRef使用与常见问题

react useRef使用与常见问题

文章目录

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

1. Dom操作: useRef()

    // 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()

      // 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的实例属性

 // 3. 对普通值进行记忆, 类似于一个class的实例属性let app = document.querySelector('#app');let root = ReactDOM.createRoot(app);let { useState, useEffect, useRef } = React;let Welcome = (props) => {// 响应式数据,具有记忆功能,点击后响应式数据加1const [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,只在更新时触发

 // 4. 结合useEffect,只在更新时触发let app = document.querySelector('#app');let root = ReactDOM.createRoot(app);let { useState, useEffect, useRef } = React;let Welcome = (props) => {// 响应式数据,具有记忆功能,点击后响应式数据加1const [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

http://www.lryc.cn/news/129632.html

相关文章:

  • Axios使用CancelToken取消重复请求
  • 九耶丨阁瑞钛伦特-Spring boot与Spring cloud 之间的关系
  • 总结,由于顺丰的问题,产生了电脑近期一个月死机问题集锦
  • C#程序配置读写例子 - 开源研究系列文章
  • Angular中的管道Pipes
  • React入门 jsx学习笔记
  • sqlserver数据库中把一张表中的数据复制到另一张表中
  • el-table 多个表格切换多选框显示bug
  • UE5.2程序发布及运行问题记录
  • c语言strtol函数、strtod函数、strtoul函数浅悉
  • Spark第三课
  • LangChain手记 Chains
  • ONNX版本YOLOV5-DeepSort (rknn版本已经Ready)
  • MySQL的约束
  • Lnton羚通关于【PyTorch】教程:torchvision 目标检测微调
  • AMD fTPM RNG的BUG使得Linus Torvalds不满
  • idea 转换为 Maven Project 的方法
  • es1.7.2 按照_type先聚合,再按照时间二次聚合
  • pyqt5 如何修改QplainTextEdit 背景色和主窗口的一样颜色
  • 解决使用element ui时el-input的属性type=number,仍然可以输入e的问题。
  • ShardingSphere 可观测 SQL 指标监控
  • Redisson实现分布式锁示例
  • 使用Nginx作为一个普通代理服务器
  • chatglm2-6b模型在9n-triton中部署并集成至langchain实践 | 京东云技术团队
  • Shell编程之正则表达式(非常详细)
  • RNN模型简单理解和CNN区别
  • 【Axure高保真原型】JS日期选择器筛选中继器表格
  • android bp脚本
  • Redis 数据库 NoSQL
  • RN 项目异常问题整理