精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

React新文檔:不要濫用Ref哦!

開發 前端
React新文檔有個很有意思的細節:useRef、useEffect這兩個API的介紹,在文檔中所在的章節叫Escape Hatches(逃生艙)。

大家好,我卡頌。

React新文檔有個很有意思的細節:useRef、useEffect這兩個API的介紹,在文檔中所在的章節叫Escape Hatches(逃生艙)。

顯然,正常航行時是不需要逃生艙的,只有在遇到危險時會用到。

如果開發者過多依賴這兩個API,可能是誤用。

??在React新文檔:不要濫用effect哦??中我們談到useEffect的正確使用場景。

今天,我們來聊聊Ref的使用場景。

為什么是逃生艙?

先思考一個問題:為什么ref、effect被歸類到「逃生艙」中?

這是因為二者操作的都是「脫離React控制的因素」。

effect中處理的是「副作用」。比如:在useEffect中修改了document.title。

document.title不屬于React中的狀態,React無法感知他的變化,所以被歸類到effect中。

同樣,「使DOM聚焦」需要調用element.focus(),直接執行DOM API也是不受React控制的。

雖然他們是「脫離React控制的因素」,但為了保證應用的健壯,React也要盡可能防止他們失控。

失控的Ref

對于Ref,什么叫失控呢?

首先來看「不失控」的情況:

  • 執行ref.current的focus、blur等方法。
  • 執行ref.current.scrollIntoView使element滾動到視野內。
  • 執行ref.current.getBoundingClientRect測量DOM尺寸。

這些情況下,雖然我們操作了DOM,但涉及的都是「React控制范圍外的因素」,所以不算失控。

但是下面的情況:

  • 執行ref.current.remove移除DOM。
  • 執行ref.current.appendChild插入子節點。

同樣是操作DOM,但這些屬于「React控制范圍內的因素」,通過ref執行這些操作就屬于失控的情況。

舉個例子,下面是React文檔中的例子[1]:

「按鈕1」點擊后會插入/移除 P節點,「按鈕2」點擊后會調用DOM API移除P節點:

export default function Counter() {
const [show, setShow] = useState(true);
const ref = useRef(null);
return (
<div>
<button
onClick={() => {
setShow(!show);
}}>
Toggle with setState
</button>
<button
onClick={() => {
ref.current.remove();
}}>
Remove from the DOM
</button>
{show && <p ref={ref}>Hello world</p>}
</div>
);
}

「按鈕1」通過React控制的方式移除P節點。

「按鈕2」直接操作DOM移除P節點。

如果這兩種「移除P節點」的方式混用,那么先點擊「按鈕1」再點擊「按鈕2」就會報錯:

圖片

這就是「使用Ref操作DOM造成的失控情況」導致的。

如何限制失控

現在問題來了,既然叫「失控」了,那就是React沒法控制的(React總不能限制開發者不能使用DOM API吧?),那如何限制失控呢?

在React中,組件可以分為:

  • 高階組件
  • 低階組件

「低階組件」指那些「基于DOM封裝的組件」,比如下面的組件,直接基于input節點封裝:

function MyInput(props) {
return <input {...props} />;
}

在「低階組件」中,是可以直接將ref指向DOM的,比如:

function MyInput(props) {
const ref = useRef(null);
return <input ref={ref} {...props} />;
}

「高階組件」指那些「基于低階組件封裝的組件」,比如下面的Form組件,基于Input組件封裝:

function Form() {
return (
<>
<MyInput/>
</>
)
}

「高階組件」無法直接將ref指向DOM,這一限制就將「ref失控」的范圍控制在單個組件內,不會出現跨越組件的「ref失控」。

以文檔中的示例[2]為例,如果我們想在Form組件中點擊按鈕,操作input聚焦:

function MyInput(props) {
return <input {...props} />;
}
function Form() {
const inputRef = useRef(null);
function handleClick() {
inputRef.current.focus();
}
return (
<>
<MyInput ref={inputRef} />
<button onClick={handleClick}>
input聚焦
</button>
</>
);
}

點擊后,會報錯:

圖片

這是因為在Form組件中向MyInput傳遞ref失敗了,inputRef.current并沒有指向input節點。

究其原因,就是上面說的「為了將ref失控的范圍控制在單個組件內,React默認情況下不支持跨組件傳遞ref」。

人為取消限制

如果一定要取消這個限制,可以使用forwardRef API顯式傳遞ref:

const MyInput = forwardRef((props, ref) => {
return <input {...props} ref={ref} />;
});
function Form() {
const inputRef = useRef(null);
function handleClick() {
inputRef.current.focus();
}
return (
<>
<MyInput ref={inputRef} />
<button onClick={handleClick}>
Focus the input
</button>
</>
);
}

使用forwardRef(forward在這里是「傳遞」的意思)后,就能跨組件傳遞ref。

在例子中,我們將inputRef從Form跨組件傳遞到MyInput中,并與input產生關聯。

在實踐中,一些同學可能覺得forwardRef這一API有些多此一舉。

但從「ref失控」的角度看,forwardRef的意圖就很明顯了:既然開發者手動調用forwardRef破除「防止ref失控的限制」,那他應該知道自己在做什么,也應該自己承擔相應的風險。

同時,有了forwardRef的存在,發生「ref相關錯誤」后也更容易定位錯誤。

useImperativeHandle

除了「限制跨組件傳遞ref」外,還有一種「防止ref失控的措施」,那就是useImperativeHandle,他的邏輯是這樣的:

既然「ref失控」是由于「使用了不該被使用的DOM方法」(比如appendChild),那我可以限制「ref中只存在可以被使用的方法」。

用useImperativeHandle修改我們的MyInput組件:

const MyInput = forwardRef((props, ref) => {
const realInputRef = useRef(null);
useImperativeHandle(ref, () => ({
focus() {
realInputRef.current.focus();
},
}));
return <input {...props} ref={realInputRef} />;
});

現在,Form組件中通過inputRef.current只能取到如下數據結構:

{
focus() {
realInputRef.current.focus();
},
}

就杜絕了「開發者通過ref取到DOM后,執行不該被使用的API,出現ref失控」的情況。

總結

正常情況,Ref的使用比較少,他是作為「逃生艙」而存在的。

為了防止錯用/濫用導致ref失控,React限制「默認情況下,不能跨組件傳遞ref」。

為了破除這種限制,可以使用forwardRef。

為了減少ref對DOM的濫用,可以使用useImperativeHandle限制ref傳遞的數據結構。

參考資料

[1]React文檔中的例子:https://codesandbox.io/s/sandpack-project-forked-s33q3c。

[2]文檔中的示例:https://codesandbox.io/s/sandpack-project-forked-7zqgmd。


責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2022-06-05 21:27:40

Reacteffect

2021-10-22 15:45:32

開發技能React

2022-05-27 16:03:37

ReactDanVue

2021-05-11 07:51:30

React ref 前端

2023-03-20 07:12:54

GPT學習React

2023-11-07 11:24:18

2012-02-20 09:56:55

ibmdw

2009-03-11 08:46:46

Chrome瀏覽器更新

2023-01-05 08:34:48

JDK工具

2020-10-19 10:25:57

ReactReact.js前端

2022-07-11 06:56:00

Reactreact-dom

2022-05-20 15:27:41

React工具Vue

2023-04-11 16:31:10

開發React 庫Web

2023-03-19 11:42:19

React新官方文檔

2021-02-08 18:25:52

微軟WindowsWindows 10

2012-02-16 13:36:39

JavaJavaFX

2023-05-19 10:04:18

Vue開發者代碼

2024-06-03 08:32:54

2021-07-26 10:36:04

華為云云辦公

2013-03-21 17:42:35

點贊
收藏

51CTO技術棧公眾號

亚洲欧美日本一区二区三区| 美乳视频一区二区| 少妇被躁爽到高潮无码文| 91国内精品| 一本一本久久a久久精品综合麻豆| 日韩欧美99| 亚洲精品字幕在线| 美国一区二区三区在线播放 | 成人在线资源网址| 无码人妻精品一区二区| 午夜精品免费| 在线观看久久av| 无码一区二区精品| 97久久中文字幕| 一本大道综合伊人精品热热| 97av中文字幕| 日本中文字幕在线看| av网站免费线看精品| 91情侣偷在线精品国产| 国产免费www| 精久久久久久| 欧美精品手机在线| 日本午夜精品视频| 免费欧美视频| 亚洲精品久久在线| wwwxxx色| 精品伊人久久| 欧美欧美午夜aⅴ在线观看| 日韩久久一级片| 91视频欧美| 亚洲乱码国产乱码精品精的特点 | 成人h视频在线| 天天干天天干天天| 99国产精品| 国外色69视频在线观看| 五月婷婷综合激情网| 精品国内自产拍在线观看视频 | 国产成人免费91av在线| 国产一级做a爱片久久毛片a| 最新亚洲激情| 久久免费视频在线观看| 久久久精品一区二区涩爱| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 日韩美女黄色片| 欧美色图麻豆| 欧美激情小视频| 久久久久久久久久综合| 欧美国产精品| 欧美大片大片在线播放| 青娱乐国产在线| 欧美私人啪啪vps| 欧美激情免费看| 国产一级特黄视频| 亚洲第一黄网| 2018中文字幕一区二区三区| 青青草av在线播放| 国产日韩欧美三区| 青草成人免费视频| 欧美人一级淫片a免费播放| 老司机午夜精品视频| 国产va免费精品高清在线| 老熟妇一区二区三区| 青青草精品视频| 国产在线观看精品| 精品国产一级片| 成人高清免费观看| 另类欧美小说| a天堂在线资源| 亚洲日本在线天堂| 国产一级爱c视频| 暖暖成人免费视频| 欧美日韩三级在线| 久久久久无码精品| 久久91在线| 亚洲嫩模很污视频| 亚洲女同二女同志奶水| 午夜日韩视频| 欧美在线免费看| 中文字幕一区二区免费| 国产伦精品一区二区三区免费| 动漫精品视频| 精品无人乱码| 亚洲乱码日产精品bd| 成年人网站免费视频| 97精品国产综合久久久动漫日韩| 在线不卡a资源高清| 日本69式三人交| 操欧美老女人| 国模精品视频一区二区三区| 无码任你躁久久久久久久| 精品综合久久久久久8888| 好吊色欧美一区二区三区视频| 理论在线观看| 亚洲激情图片小说视频| 免费黄色日本网站| 国产美女视频一区二区| 日韩电影网在线| 亚洲一级生活片| 性娇小13――14欧美| 91久久精品在线| 欧美欧美欧美| 亚洲午夜免费电影| www.亚洲自拍| 国内精品久久久久久99蜜桃| 欧美肥老妇视频| 中文字幕在线播放不卡| 99国产精品一区| 日本一道在线观看| 国产三级一区| 欧美精品一区二区三区在线播放 | 一区二区三区四区乱视频| 日本在线视频www| 99re热精品视频| 久久夜精品香蕉| 中国一区二区视频| 26uuu亚洲综合色| 国产精品久久久久久久久电影网| 农村妇女一区二区| 亚洲人成网7777777国产| 国产在线观看你懂的| 国产揄拍国内精品对白| 台湾成人av| 丝袜美腿一区| 国产视频亚洲精品| 三级黄色在线视频| 国产成人av一区二区三区在线 | 免费a级黄色片| 伊人蜜桃色噜噜激情综合| 国产精品一区二区久久久久| 九一国产在线| 欧美性猛交xxxx免费看漫画 | 国产欧美日韩三区| 国产aaa一级片| 亚洲区小说区图片区qvod按摩| 久久久久久中文字幕| 成人激情四射网| 一区二区三区欧美日| 国产美女视频免费看| 日韩中文字幕高清在线观看| 国产成人精品在线| 国产一级免费在线观看| 欧美日韩中文字幕| 国产精品三级在线观看无码| 在线一区视频| 鲁丝一区二区三区免费| 韩漫成人漫画| 国产亚洲一区二区在线| 中文字幕 亚洲视频| 中文字幕成人网| 亚洲综合欧美激情| 91久久高清国语自产拍| 亚洲自拍小视频| 日本高清在线观看| 欧美精品一区二区三区一线天视频| 日韩av女优在线观看| 99久久99久久久精品齐齐| 精品欧美一区免费观看α√| 要久久爱电视剧全集完整观看| 日本韩国欧美精品大片卡二| h视频网站在线观看| 欧美色综合影院| 日韩福利小视频| 国产经典欧美精品| 狠狠干 狠狠操| 精品国产美女| 成人黄色激情网| 日韩伦理电影网站| 日韩电影大片中文字幕| 69av视频在线观看| 亚洲日本电影在线| av av在线| 久久这里只有| 超碰免费在线公开| 国产suv精品一区二区四区视频| 性欧美长视频免费观看不卡| 国产视频精选在线| 日韩欧美一区中文| 国产精品人人人人| 一区在线中文字幕| 一级欧美一级日韩片| 日韩成人一级大片| 欧美性猛交内射兽交老熟妇| 精品一区三区| 亚洲综合av影视| 原纱央莉成人av片| 久久久成人精品| 日韩一级片免费在线观看| 欧美中文字幕一二三区视频| 国产盗摄一区二区三区在线| 26uuu精品一区二区在线观看| 手机免费av片| 国产精品日韩精品欧美精品| 亚洲 欧洲 日韩| 台湾色综合娱乐中文网| 成人黄色大片在线免费观看| 九色porny丨首页入口在线| 深夜福利日韩在线看| 黄色一级大片在线免费看国产一| 欧洲日韩一区二区三区| 国产精品成人av久久| 国产精品欧美综合在线| 欧美成人三级伦在线观看| 国内精品视频一区二区三区八戒| 国产一区二区三区精彩视频 | 欧美一区 二区| 国产在线精品一区免费香蕉 | 国产熟妇搡bbbb搡bbbb| 国产成人免费视频网站高清观看视频| 国产一区亚洲二区三区| 亚洲精品影视| 国产a级黄色大片| 欧美高清视频手机在在线| 久久国产精品99久久久久久丝袜| 成人污版视频| 国产精品一区二区三区免费视频 | 欧美视频一二三| 久久久久久久久97| 亚洲欧洲综合另类在线| 亚洲女优在线观看| 99久久国产综合精品女不卡| ass极品水嫩小美女ass| 激情综合色丁香一区二区| 亚洲少妇第一页| 亚洲欧美大片| 国产91在线免费| 日韩视频一区| 97超碰在线人人| 欧美私人啪啪vps| 久久久99精品视频| 自拍欧美日韩| 黄色网址在线免费看| 欧美色图在线播放| 日本最新一区二区三区视频观看| 丝袜美腿综合| 欧美另类视频在线| 色综合www| 蜜桃传媒视频麻豆第一区免费观看| 国产精品巨作av| 国产精品夜夜夜一区二区三区尤| 在线综合色站| 国产精品theporn88| 99久久人爽人人添人人澡 | www,av在线| 国产一区二区在线观看免费| 在线播放av中文字幕| 久久91精品国产91久久小草| 九九九九九国产| 国产一区二区免费看| 精产国品一区二区三区| 国产成人啪免费观看软件| 伊人久久久久久久久| 黄色一级视频免费| 久久精品一区二区三| 国产欧美日韩视频一区二区 | 成人午夜激情片| 无人码人妻一区二区三区免费| 国产麻豆日韩欧美久久| 91成人在线观看喷潮蘑菇| 高清在线观看日韩| 波多野结衣加勒比| 91蝌蚪porny| 中文字幕第24页| 国产精品久久久久久久蜜臀| 亚洲一级二级片| 亚洲免费观看在线视频| 久久午夜无码鲁丝片| 性久久久久久久久久久久| 国偷自拍第113页| 在线亚洲精品福利网址导航| 亚洲自拍第二页| 日韩女优制服丝袜电影| 色网站免费观看| 亚洲视频网站在线观看| 蜜桃视频在线观看免费视频网站www| 欧美成人午夜剧场免费观看| 暧暧视频在线免费观看| 日韩av快播网址| 国产精品va视频| 精品亚洲第一| 999精品在线| 日本福利视频一区| 日韩电影在线观看一区| 国产成人精品一区二区在线小狼| 成+人+亚洲+综合天堂| 欧美18—19性高清hd4k| 一区二区三区中文在线观看| av图片在线观看| 在线综合+亚洲+欧美中文字幕| 成人免费视频国产免费麻豆| 亚洲片在线观看| 伊人影院在线视频| 国产精品精品一区二区三区午夜版| 精品午夜视频| 日韩免费av电影| 在线精品一区二区| 激情五月婷婷基地| 2017欧美狠狠色| 久久久久97国产| 欧美少妇一区二区| 青青草在线视频免费观看| 久久综合免费视频| 吞精囗交69激情欧美| 国产精品12| 综合久久婷婷| 中文字幕 91| 久久精品这里都是精品| 国产精品111| 88在线观看91蜜桃国自产| 麻豆av电影在线观看| 97精品欧美一区二区三区| 国内不卡的一区二区三区中文字幕| 日本一区二区久久精品| 亚洲精品系列| 亚洲成年人av| 亚洲精品国产品国语在线app| 中文字幕观看视频| 亚洲天堂av综合网| 老色鬼在线视频| 国产欧美日韩视频一区二区三区| 91成人免费| 一区二区三区欧美精品| 欧美激情一区二区三区全黄| 天天操夜夜操视频| 亚洲精品720p| av剧情在线观看| 99精彩视频| 午夜欧美视频| 一卡二卡三卡四卡五卡| 亚洲女女做受ⅹxx高潮| 亚洲天堂中文在线| 综合国产在线视频| 国产成人77亚洲精品www| 日本一区二区不卡高清更新| 久久一综合视频| 日本一卡二卡在线播放| 在线亚洲欧美专区二区| eeuss影院www在线播放| 国产91免费观看| 国产欧美久久一区二区三区| 日本成人在线免费视频| 久久久久久久久久久黄色| 日日夜夜狠狠操| 一本色道久久综合狠狠躁篇的优点| 亚洲va中文在线播放免费| 日本精品一区二区三区视频| 日韩精品午夜视频| 欧美人与禽zoz0善交| 欧美精品亚洲二区| 国产剧情在线| 国产成人av一区二区三区| 亚洲视频二区| 免费看91的网站| 欧美剧情电影在线观看完整版免费励志电影 | 精品写真视频在线观看| 国产精品九九九九九九| 国产真实有声精品录音| 亚洲激情一区二区三区| 久久国产三级精品| 亚洲不卡在线播放| 精品国产亚洲一区二区三区在线观看| 欧美videossex| 九九九九精品| 天堂蜜桃一区二区三区| 手机看片国产日韩| 91精品国产一区二区| 电影k8一区二区三区久久| 精品久久久久亚洲| 日韩精品一区第一页| sm捆绑调教视频| 日韩欧美一二三四区| a天堂资源在线| 日本一区视频在线| 国产在线播精品第三| 国产一级在线免费观看| 亚洲区一区二区| 国产精品美女久久久久| 欧美 日韩 亚洲 一区| 国产日产欧美一区| 国产高清不卡视频| 欧美综合第一页| 亚洲精品久久| 一女三黑人理论片在线| 欧美日高清视频| 9999精品成人免费毛片在线看| 欧美午夜精品久久久久久蜜| 精品无人码麻豆乱码1区2区| 日韩成人高清视频| 日韩在线视频线视频免费网站| 97久久亚洲| www欧美激情| 午夜欧美一区二区三区在线播放| 成人高清免费在线播放| 国产精品国产精品| 久久精品国产一区二区| 精品成人久久久| 久久成人精品视频| 亚洲宅男一区| 天堂www中文在线资源| 欧美日韩国产综合视频在线观看 | wwwxxx色|