什么时候使用 ref?
当你希望组件"记住"某些信息,但又不想让这些信息 触发新的渲染 时,你可以使用 ref 。以下是使用的几个场景:
- 存储 timeout ID
- 存储和操作 DOM 元素
- 存储不需要被用来计算 JSX 的其他对象
怎么使用 ref?
1、引入 ref。
javascript
import { useRef } from 'react';
2、在你的组件内,调用 useRef Hook 并传入你想要引用的初始值作为唯一参数。
javascript
const ref = useRef(0);
3、useRef 返回一个这样的对象:
javascript
{
current: 0 // 你向 useRef 传入的值
}
4、你可以用 ref.current 属性访问该 ref 的当前值。这个值是有意被设置为可变的,意味着你既可以读取它也可以写入它。
javascript
ref.current = 3;
useRef 内部是如何运行的?
原则上 useRef 可以在 useState 的基础上 实现。 你可以想象在 React 内部,useRef 是这样实现的:
javascript
// React 内部
function useRef(initialValue) {
const [ref, unused] = useState({ current: initialValue });
return ref;
}
第一次渲染期间,useRef 返回 { current: initialValue }。 该对象由 React 存储,因此在下一次渲染期间将返回相同的对象。 请注意,在这个示例中,state 设置函数没有被用到。它是不必要的,因为 useRef 总是需要返回相同的对象!
ref 和 state 的不同之处
ref | state |
---|---|
useRef (initialValue) 返回 { current: initialValue } |
useRef(initialValue) 返回 { current: initialValue } |
更改时不会触发重新渲染 | 更改时触发重新渲染 |
可变 ------ 你可以在渲染过程之外修改和更新 current 的值。 |
"不可变" ------ 你必须使用 setState 设置函数来修改 state 变量,从而排队重新渲染。 |
在渲染期间读取(或写入) current 值页面不会改变。 | 你可以随时读取 state 。但是,每次渲染都有自己不变的 state 快照。 |