日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

有人抵觸Ref?有人抵觸Reactive?

來源: 責編: 時間:2024-05-07 09:15:05 159觀看
導讀前言大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~背景這幾天看到好多文章標題都是類似于:不用 ref 的 xx 個理由不用 reactive 的 xx 個理由歷數 ref 的 xx 宗罪我就很不

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~3k628資訊網——每日最新資訊28at.com

背景

這幾天看到好多文章標題都是類似于:3k628資訊網——每日最新資訊28at.com

  • 不用 ref 的 xx 個理由
  • 不用 reactive 的 xx 個理由
  • 歷數 ref 的 xx 宗罪

我就很不解,到底是什么原因導致有這兩批人:3k628資訊網——每日最新資訊28at.com

  • 抵觸 ref 的人
  • 抵觸 reactive 的人

看了這些文章,我可以總結出他們的想法3k628資訊網——每日最新資訊28at.com

抵觸 reactive 的人

抵觸 reactive 的人,他們的想法大概就是:3k628資訊網——每日最新資訊28at.com

  • 1、Vue 官方推薦 ref
  • 2、reactive 有類型限制,ref 沒有
  • 3、reactive 使用不當會丟失響應式,比如解構
  • 4、reactive 無法修改整個對象的值

抵觸 ref 的人

抵觸 ref 的人,他們的想法大概就是:3k628資訊網——每日最新資訊28at.com

  • 1、ref 的底層其實就是 reactive,用 ref 相當于多了一層,耗費性能
  • 2、ref 的 .value 用起來很麻煩,增加使用者心里負擔
  • 3、ref 到模板的時候會解掉 value 這一層,這時候也會耗費性能

把我整笑了~

說實話,看到這些文章,有點把我整笑了,其實你要用 ref 或者 reactive 都沒錯,但是沒比必要那么抵觸,編程很多時候并不是非黑即白啊。。。3k628資訊網——每日最新資訊28at.com

既然 Vue3 推出了 ref 和 reactive,那就說明他們都有存在的必要,在項目中不同的場景去運用他們,我覺得才是最好的,而不是用一個不用另一個,不止這兩個,還有很多其他好用的 Vue3 API3k628資訊網——每日最新資訊28at.com

我想針對這兩批人的想法做一個回應:3k628資訊網——每日最新資訊28at.com

回應 -> 抵觸 reactive 的人

  • 1、官方是推薦,不是抵觸
  • 2、reactive 既然有類型限制,那就在特定時候用 reactive 就行
  • 3、使用不當會丟失響應式?那就是開發者對于 Vue3 API 的使用還不熟
  • 4、用 Object.assign 就可以修改整個對象的值

回應 -> 抵觸 ref 的人

  • 1、耗費性能的話,這么久了,也沒人貼出到底耗費了多少性能?
  • 2、.value 不麻煩,我覺得 .value 可以起到辨別響應式和非響應式數據的效果,而且現在編輯器都有插件提供的代碼補全了,多個 .value 也花不了多少時間吧?

靈活使用 Vue3 API 才是王道

其實在平時開發中,我覺得基本數據類型和數組,都可以用 ref 來管理,而對象的話可以使用 reactive 來管理,比如表單對象、狀態對象3k628資訊網——每日最新資訊28at.com

其實 Vue3 不止有這兩個 API ,還有很多其他 API ,也很好用,大家只要去靈活使用它們,能讓你的Vue3 項目上一個層次3k628資訊網——每日最新資訊28at.com

readonly

顧名思義,就是只讀的意思,如果你的數據被這個 API 包裹住的話,那么修改之后并不會觸發響應式,并且會提示警告3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

readonly 的用途一般用于一些 hooks 暴露出來的變量,不想外界去修改,比如我封裝一個 hooks,這樣去做的話,那么外界只能用變量,但是不能修改變量,這樣大大保護了 hooks 內部的邏輯~3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

shallowRef

shallowRef 用來包住一個基礎類型或者引用類型,如果是基礎類型那么跟 ref 基本沒區別,如果是引用類型的話,那么直接改深層屬性是不能觸發響應式的,除非直接修改引用地址,如下:3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

注意:改深層屬性能改數據,只是沒觸發響應式,所以當下一次響應式觸發的時候,你修改的深層數據會渲染到頁面上~3k628資訊網——每日最新資訊28at.com

shallowRef 的用處主要用于一些比較大的但又變化不大的數據,比如我有一個表格數據,通過接口直接獲取,并且主要用在前端展示,需要修改一些深層的屬性,但是這些屬性并不需要立即表現在頁面上,比如以下例子,我只需要展示 name、age 字段,至于 isOld 字段并不需要展示,我想要計算 isOld 但是又不想觸發響應式更新,所以可以用 shallowRef 包起來,進而減少響應式更新,優化性能3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

shallowReactive

shallowReactive 用來包住一個引用類型,被包住后,修改第一層才會觸發響應式更新,也就是淺層的屬性,修改深層的屬性并不會觸發響應式更新3k628資訊網——每日最新資訊28at.com

注意:改深層屬性能改數據,只是沒觸發響應式,所以當下一次響應式觸發的時候,你修改的深層數據會渲染到頁面上~3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

shallowReactive 用的比較少,shallowReactive 的用處跟 shallowRef 比較像,都是為了讓一些比較大的數據能減少響應式更新,進而優化性能3k628資訊網——每日最新資訊28at.com

toRef & toRefs

先說說 toRef 吧,我們平時在使用 reactive 的時候會有一個苦惱,那就是解構,比如看以下例子,我們為了少些一些代碼,解構出來了 name 并放到模板里渲染,但是當我們想改原數據的時候,發現 name 并不會更新,這就是解構出來基礎類型的苦惱3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

這時我們可以使用 toRef,這個時候我們直接修改 name 也會觸發原數據的修改,修改原數據也會觸發 name 的修改3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

圖片3k628資訊網——每日最新資訊28at.com

但是如果是屬性太多了,我們想一個一個去用 toRef 的話會寫很多代碼3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

所以我們可以使用 toRefs 一次性解構3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

toRaw & markRaw & unref

toRaw 可以把一個響應式 reactive 轉成普通對象,也就是把響應式對象轉成非響應式對象3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

toRaw 主要用在回調傳參中,比如我封裝一個 hooks,我想要把 hooks 內維護的響應式變量轉成普通數據,當做參數傳給回調函數,可以用 toRaw3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

markRaw 可以用來標記響應式對象里的某個屬性不被追蹤,如果你的響應式對象里有某個屬性數據量比較大,但又不想被追蹤,你可以使用 markRaw3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

unref 相當于返回 ref 的 value3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

effectScope & onScopeDispose

effectScope 可以有兩個作用:3k628資訊網——每日最新資訊28at.com

  • 收集副作用
  • 全局狀態管理

收集副作用

比如我們封裝一個共用的 hooks,為了減少頁面隱患,肯定會統一收集副作用,并且在組件銷毀的時候去統一消除,比如以下代碼:3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

但是這么收集很麻煩, effectScope 能幫我們做到統一收集,并且通過 stop 方法來進行清除,且 stop 執行的時候會觸發 effectScope 內部的 onScopeDispose3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

我們可以利用 effectScope & onScopeDispose 來做一些性能優化,比如下面這個例子,我們封裝一個鼠標監聽的 hooks3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

但是如果在頁面里調用多次的話,那么勢必會往 window 身上監聽很多多余的事件,造成性能負擔,所以解決方案就是,無論頁面里調用再多次 useMouse,我們只往 window 身上加一個鼠標監聽事件3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

全局狀態管理

現在 Vue3 最火的全局狀態管理工具肯定是 Pinia 了,那么你們知道 Pinia 的原理是什么嗎?原理就是依賴了 effectScope3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

所以我們完全可以自己使用 effectScope 來實現自己的局部狀態管理,比如我們封裝一個通用組件,這個組件層級比較多,并且需要共享一些數據,那么這個時候肯定不會用 Pinia 這種全局狀態管理,而是會自己寫一個局部的狀態管理,這個時候 effectScope 就可以排上用場了3k628資訊網——每日最新資訊28at.com

vueuse 中的 createGlobalState 就是為了這個而生3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com

provide & inject

Vue3 用來提供注入的 API,主要是用在組件的封裝,比如那種層級較多的組件,且子組件需要依賴父組件甚至爺爺組件的數據,那么可以使用 provide & inject,最典型的例子就是 Form 表單組件,可以去看看各個組件庫的源碼,表單組件大部分都是用 provide & inject 來實現的,比如 Form、Form-Item、Input這三個需要互相依賴對方的規則、字段名、字段值,所以用 provide & inject 會更好。具體用法看文檔吧~https://cn.vuejs.org/guide/components/provide-inject.html3k628資訊網——每日最新資訊28at.com

圖片圖片3k628資訊網——每日最新資訊28at.com


3k628資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87036-0.html有人抵觸Ref?有人抵觸Reactive?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 總是做后臺管理系統,到底要怎么提升自己呢?

下一篇: 每個開發者都必須要知道的,三個JS高效運算符:?. || ?? || ??=

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 如何使用JavaScript創建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經瀏覽過購物網站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區域,以便瀏覽。結合這個小小的重要功能可以大大改善您網站的用戶體驗
  • 三分鐘白話RocketMQ系列—— 如何發送消息

    我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何發送消息的,揭秘消息生產全過程。注意,如果白話中不小心提到相關代
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現“美團直播”的固定入口。在直播聚合頁面,外賣“神槍手”直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 三星獲批量產iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續在今年9月舉辦一年一度的秋季新品發布會,有傳言稱發布會將于9月12日舉行,屆時全新的iPhone 15系列將正式與大家見面,不出意外的話
Top 主站蜘蛛池模板: 兰溪市| 灵武市| 武鸣县| 萨迦县| 从化市| 江永县| 延川县| 平利县| 黄浦区| 本溪市| 顺平县| 汝阳县| 乌兰浩特市| 额敏县| 堆龙德庆县| 黔东| 罗江县| 信阳市| 西城区| 叙永县| 天全县| 临西县| 昌乐县| 理塘县| 南华县| 图片| 东宁县| 古丈县| 融水| 黎城县| 革吉县| 泸水县| 临高县| 峨眉山市| 连平县| 莱州市| 伊春市| 宜兴市| 客服| 房山区| 许昌市|