前情提要 ?
其實 React 寫到現在已經滿一年了,還是有不少 React 的東西我不是很了解,
究竟是因為用不到所以不了解,還是因為不了解所以沒用到呢?
因為我在看一些 document 的時候,看到有一些 forwardRef 的用法,
就決定來了解一下這到底是什麼?
什麼是 forwardRef ?
我讀了一下文件,
以我的理解來說就是,
「把子層 component 的 ref 傳到父層去使用」
疑問
看起來這個定義蠻直觀的,
而且本身命名也是吻合他的用法,
但去了解他具體怎麼用的時候我就產生了一些疑問,
不囉唆直接上 code
這是一般使用 forwardRef 的方法
- 在要使用 ref 的那一個 component 使用 useRef 建立 ref
- 傳給要操作的 dom 的 component 裡面
- component 會用 forwardRef 這個 function 包住 component,他會回傳兩個參數分別是 props 和 ref
- 在把 ref 傳到要操縱的元素上面即可
import React, { useEffect, forwardRef, useRef } from "react";
export function App(props) {
const btnRef = useRef(null);
useEffect(() => {
console.log(btnRef, "btnRef");
}, []);
return (
<div className="App">
<h1>Hello React.</h1>
<h2>Start editing to see some magic happen!</h2>
<CustomButton ref={btnRef} />
</div>
);
}
const ButtonWithForwardRef = forwardRef(function CustomButton(props, ref) {
return <button ref={ref}>button</button>;
});
做到這邊其實很直觀的就會想到一個問題
那就是整個傳入 ref 的概念不就跟傳 props 一樣嗎?
為啥還要多一個 forwardRef 來只用來傳 ref ?
沒錯
我硬要用一般 props 傳入的方法一樣可以 work
但要注意的是情事 component 沒有執行 forwardRef 時
在父層傳入會無效,因此要命名 ref 以外的 e.g. btnRef 之類的
So Why forwardRef
那照前面的說明,forwardRef 好像就沒有存在的必要?
我的結論是
如果是寫 function component 確實是沒有差別
除了以 prop 傳 ref 可能會讓別人在使用 component 的時候比較不理解,因為他不能直接命名 ref
第二個原因是為了讓class component重構至function component
能更佳 smooth,
不需要再去改父層的 api