手机网站关键词优化软件,网站推广软件污,义马网站开发,区块链企业解决方案基本用法
在类组件中获取一个dom元素实例#xff0c;可以通过React.CreateRef或者回调函数的方式去获取。语法#xff1a;const refContainer useRef(initialValue);使用场景#xff1a;在 React 中进行 DOM 操作时#xff0c;用来获取 DOM作用#xff1a;返回一个带有 …基本用法
在类组件中获取一个dom元素实例可以通过React.CreateRef或者回调函数的方式去获取。语法const refContainer useRef(initialValue);使用场景在 React 中进行 DOM 操作时用来获取 DOM作用返回一个带有 current 属性的可变对象通过该对象就可以进行 DOM 操作了。 const inputRef useRef(null) 解释
参数在获取 DOM 时一般都设置为 null返回值包含 current 属性的对象。 注意只要在 React 的函数组件中进行 DOM 操作都可以通过 useRef Hook 来获取 DOM比如获取 DOM 的宽高等。注意useRef不仅仅可以用于操作DOM还可以操作组件 通过useRef获取DOM元素或组件实例
import React from react
import {useRef} from reactexport default function UseRef() {let inputRef useRef()function login() {console.log(inputRef.current.value)}return (divinput ref{inputRef} placeholder{请输入账号} /button onClick{login}登录/button/div)
}
绑定ref后和React.createRef返回的结构一致通过.current获取到元素。 useRef保存数据
在文件中定义一个全局变量保存数据
存在 bug
UseRef.jsx
import {useRef, useState} from react;let count 0;export default function UseRef() {console.log(ref)let inputRef useRef()function login() {count 1;}function printCount() {console.log(count)}return (divinput ref{inputRef} placeholder{请输入账号} /button onClick{login}登录/buttonbutton onClick{printCount}打印count/button/div)
}
这种全局保存变量的方式有问题原因在于在组件中多次使用这个组件会共享数据可能会导致一些bug存在。
import UseRef from ./components/UseRefexport default function App() {return (divUseRef /UseRef //div)
} 在函数组件中直接定义变量
存在 bug
import {useRef, useState} from react;export default function UseRef() {let count 0;console.log(ref)let inputRef useRef()let [name, setName] useState(张三)function login() {count 1;}function printCount() {console.log(count)}return (divinput ref{inputRef} placeholder{请输入账号} /button onClick{login}登录/buttonbutton onClick{printCount}打印count/button姓名{name}button onClick{() setName(李四)}修改name/button/div)
}
这种方式可以短暂的保存值但是一旦函数组件更新渲染那么这个变量的值就会重置
原因是因为函数组件更新渲染时代码从上往下重新运行。 使用useRef保存值
在整个生命周期里ref里存储的都是同一个这样就可以----
解决闭包陷阱问题
import {useRef, useState} from react;export default function UseRef() {// let count 0;let count useRef(0);console.log(ref)let inputRef useRef()let [name, setName] useState(张三)function login() {// console.log(inputRef.current.value)count.current 1;}function printCount() {console.log(count.current)}return (divinput ref{inputRef} placeholder{请输入账号} /button onClick{login}登录/buttonbutton onClick{printCount}打印count/button姓名{name}button onClick{() setName(李四)}修改name/button/div)
}
通过useRef保存值可以长期存贮不会重置 使用useRef定义变量的好处
修改state后ref保存的数据不会变化多个组件的数据不会共享类似于class的实例字段修改ref的保存值不会引起组件的更新渲染。 总结