在介绍 useRef 之前,先来介绍 ref。
在 React 中如果我们想要获取 DOM 或获取某个 DOM 节点时,可以使用 ref,通常在几个情况下使用:
- focus / input
- text selection
- 影音播放或暂停
- 触发动画
- 整合第三方 DOM 库
在可以透过 props、state 的地方就尽量不使用 ref。
当在 HTML element 上使用 ref 参数时,可以取得它底下的 DOM element 来做为它的 current 属性
用法:
import React, { useRef } from 'react';
const refContainer = useRef(initialValue)
initialValue 为初始值(current 属性)
在 html tag 中绑定 ref={refContainer}
例如:
import React, { useRef, useEffect } from "react";
const HookUseRef = () => {
const ref = useRef(null);
console.log(ref);
return (
<>
<input type="text" ref={ref} />
<button onClick={() => console.log(ref.current)}>click</button>
</>
);
};
export default HookUseRef;
将 useRef 参数设为 null,建立一个空的 ref object,会回传一个物件 {current:null}
而点击 click 时会印出 DOM
例如:
import React, { useRef, useEffect } from "react";
const HookUseRef = () => {
const ref = useRef(null);
const click = () => {
ref.current.focus()
}
return (
<>
<input type="text" ref={ref} />
<button onClick={click}>click</button>
</>
);
};
export default HookUseRef;
点击後滑鼠游标会自动跑到输入栏位
这边将 useState()
和 useRef()
做比较:
// useState()
import { useState } from "react";
const HookUseRef = () => {
const [count, setCount] = useState(0);
const handle = () => {
const updatedCount = count + 1;
console.log(`点击 ${updatedCount} 次`);
setCount(updatedCount);
};
console.log("render");
return <button onClick={handle}>Click me</button>;
};
export default HookUseRef;
可以看到当使用 useState 时,每次点击都会重新渲染。
// useRef()
import React, { useRef, useEffect, useState } from "react";
const HookUseRef = () => {
const countRef = useRef(0);
const handle = () => {
countRef.current++;
console.log(`点击 ${countRef.current} 次`);
};
console.log("render");
return <button onClick={handle}>Click me</button>;
};
export default HookUseRef;
当使用 useRef() 时,只有首次渲染时会印出 render,之後不管点击几下都不会重新渲染。
参考资料:
https://dmitripavlutin.com/react-useref-guide/
>>: 【DAY 24】Microsoft 365 的方案有好多种,到底哪些适合我?(上)
之前介绍了几天关於架设Bot的服务器,那接下来我们用程序写Bot并放上云端服务器呢? 目前我选择了先...
受朋友的挑战,也是对自己的考验与面对自己。同时也是自己对自己的坦白,通过铁人赛来测试自己。 比起是比...
架好服务器後,要订阅服务,就是要在一个时间点去捞设定资料并产生PDF并寄送email,写一个档案去做...
嗨嗨嗨!昨天看完怎麽抓取资料的方式会影响到网页的渲染模式之後,今天的主题是 Next.js 的 Pa...
产品经理平常需要沟通的对象很多,而这些对象对专案的影响程度大小可能不尽相同,为了有效的擅用产品经理自...