欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析 Vue 3.0 的組裝式 API(一)

 更新時間:2020年08月31日 09:18:23   作者:krimeshu 的點滴積累  
這篇文章主要介紹了 Vue 3.0 的組裝式 API的部分資料,幫助大家更好的理解和學習vue,感興趣的朋友可以了解下

(一)響應式數(shù)據(jù)

1. 簡單例子

從最簡單的數(shù)據(jù)綁定開始,在 Vue 2.0 中,我們這樣將一個數(shù)據(jù)綁定到模板的指定位置:

在組件創(chuàng)建參數(shù)的 data 構造函數(shù)中返回一個用來綁定的數(shù)據(jù)對象,其中有個 now 字段,會被渲染到模板內的 .app > p 內。

<template>
  <div class="app">
    <h1>Hello world!</h1>
    <p>Now is: {{now.toString()}}</p>
  </div>
</template>

<script>
// Vue 2.0
export default {
  data() {
    return {
      now: new Date(),
    };
  },
};
</script>

用 Vue3 的組裝 API 實現(xiàn)的話,則是這樣:

// Vue 3.0
export default {
  setup() {
    return {
      now: new Date(),
    };
  },
};

2. 更新數(shù)據(jù)

奇怪,看起來好像沒啥區(qū)別,只是把 data 改成了 setup 嗎?

并不是,假如我們現(xiàn)在對這個 DEMO 做個小改動,讓它每秒鐘刷新一次時間,用 Vue2 大概是這樣實現(xiàn):

// Vue 2.0
export default {
  data() {
    return {
      now: new Date(),
    };
  },
  mounted() {
    setInterval(() => this.now = new Date(), 1000);
  },
};

而 Vue3 的等效實現(xiàn)則為:

// Vue 3.0
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const now = ref(new Date());
    onMounted(() => {
      setInterval(() => now.value = new Date(), 1000);
    });
    return {
      now,
    };
  },
};

3. 對比分析

寫了太多 Vue 的我們可能已經(jīng)忘了,Vue2 的代碼從標準 JS 模塊的角度來看有多奇怪:

  • mounted 中修改的 this.now 數(shù)據(jù)是在哪創(chuàng)建的?我們在模塊 default 對象的成員里并沒有找到對應字段,倒是在 data 內返回的另一個對象中有這個字段;
  • data 中返回的 now 也不是真正的 this.now,而是 this.now 的初始值,在 data setInterval 修改 now 并不能更新渲染出來的時間;
  • 如果想復用這個數(shù)據(jù)和它的更新邏輯,你必須將這樣的結構單獨寫一份,然后通過特殊的 mixin 函數(shù)混入到當前組件的構造參數(shù)內。

這一切,是因為整個模塊 default 對象其實是 vm 對象的構造參數(shù)。其背后隱藏了對象的創(chuàng)建邏輯,在構造對象時構造參數(shù)中的一些不同層級的字段被綁定到了 vm 對象上。

不少新手可能都犯過一個錯誤,在 data 中返回的數(shù)據(jù)字段和 props、methods 或者 computed 中的字段命名撞車(尤其是使用名為 data 的字段),在編碼階段并不能被 IDE 直接發(fā)現(xiàn)。就是因為上面的原因,這些字段創(chuàng)建時隸屬于不同的位置,在之后構造時才被綁在了同一個對象上,導致了運行時才能發(fā)現(xiàn)的沖突。

Vue3 中,改成提供 ref、reactivetoRef、onMounted 等函數(shù)的形式實現(xiàn),例子中:

  • setup 中看到的 now 即是用于綁定的 this.now;
  • 修改 now.value 即可看到頁面狀態(tài)的更新;
  • 如果要封裝這份數(shù)據(jù)處理,只需要將 nowonMounted 處理提取到同一個函數(shù)內,再將 now 返回即可,不再需要黑盒的 mixin 處理。

可以說 Vue3 是直接將響應數(shù)據(jù)的創(chuàng)建決定權、生命周期的通知回調,都通過 API 的形式交給了開發(fā)者,更直觀明了和可控。

4. API 說明

下面詳細說說常用的幾個響應式數(shù)據(jù)相關 API:ref, reactive toRefs

(1) ref

上面例子中使用到的 ref,可以將一個數(shù)據(jù)包裝成響應式數(shù)據(jù)代理對象。

const count = ref(0);
console.log(count.value); // => 0

count.value++;
console.log(count.value); // => 1

當你修改代理對象的 count.value 屬性時,模板中使用到 count 的位置將響應數(shù)據(jù)的變化,更新視圖中的數(shù)據(jù)狀態(tài)。

(2) reactive

對于對象的響應式封裝,使用 ref 稍顯麻煩:

const state = ref({
  count: 0,
});
console.log(state.value.count); // => 0

state.value.count++;
console.log(state.value.count); // => 1

這時可以改為使用 reactive,像操作普通對象的字段一樣修改 count 即可更新視圖:

const state = reactive({
  count: 0,
});
console.log(state.count); // => 0

state.count++;
console.log(state.count); // => 1

對代理對象 state 添加新的字段也可觸發(fā)視圖更新。

(3) toRefs

有時候,對象的名字過長,我們想直接在模板內使用對象內部字段,直接使用解構是不行的:

import { reactive } from 'vue';

export default {
  setup() {
    const position = reactive({
      x: 0,
      y: 0,
    });
    return {
      // 錯誤,解構出來的 x, y 并沒有響應式代理。綁定到模板上后,數(shù)據(jù)變化無法觸發(fā)視圖更新
      ...position,
    };
  },
};

這個情況下,使用 toRefs 處理后再解構賦值即可:

import { reactive, toRefs } from 'vue';

export default {
  setup() {
    const position = reactive({
      x: 0,
      y: 0,
    });
    return {
      ...toRefs(position),
    };
  },
};

但需要注意,toRefs 只處理調用時 position 的現(xiàn)有字段,如果在之后對 position 增加新字段,將無法觸發(fā)視圖更新。

以上就是淺析 Vue 3.0 的組裝式 API(一)的詳細內容,更多關于Vue 組裝式 API的資料請關注腳本之家其它相關文章!

相關文章

  • 快速解決element的autofocus失效問題

    快速解決element的autofocus失效問題

    這篇文章主要介紹了快速解決element的autofocus失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue3+element-plus props中的變量使用 v-model 報錯及解決方案

    vue3+element-plus props中的變量使用 v-model 報錯及解決方案

    這篇文章主要介紹了vue3+element-plus props中的變量使用 v-model 報錯及解決方案,prop 是單向數(shù)據(jù)流,這里只能用:model-value,不能用v-model,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • vue實現(xiàn)簡單轉盤抽獎功能

    vue實現(xiàn)簡單轉盤抽獎功能

    這篇文章主要為大家詳細介紹了vue實現(xiàn)簡單轉盤抽獎功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 基于Vue3+TypeScript實現(xiàn)鼠標框選功能

    基于Vue3+TypeScript實現(xiàn)鼠標框選功能

    這篇文章主要介紹了基于Vue3+TypeScript實現(xiàn)鼠標框選功能,文中通過代碼示例給大家講解的非常纖細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • Vue內置組件Teleport的使用

    Vue內置組件Teleport的使用

    Teleport是一個內置組件,它可以將一個組件內部的一部分模板“傳送”到該組件的?DOM?結構外層的位置去,本文就來介紹一下如何使用,感興趣的可以了解一下
    2023-05-05
  • vue+element+Java實現(xiàn)批量刪除功能

    vue+element+Java實現(xiàn)批量刪除功能

    這篇文章主要介紹了vue+element+Java實現(xiàn)批量刪除功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • vue項目熱更新的坑及解決

    vue項目熱更新的坑及解決

    這篇文章主要介紹了vue項目熱更新的坑及解決方案,具有很好的參考價值,希望對的大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue獲取token實現(xiàn)token登錄的示例代碼

    vue獲取token實現(xiàn)token登錄的示例代碼

    最近新做了個vue項目,正好項目中有登錄部分,本文就詳細的介紹一下登錄部分的實現(xiàn),文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue 中固定導航欄的實例代碼

    vue 中固定導航欄的實例代碼

    今天小編就為大家分享一篇vue 中固定導航欄的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue項目中Eslint校驗代碼報錯的解決方案

    vue項目中Eslint校驗代碼報錯的解決方案

    這篇文章主要介紹了vue項目中Eslint校驗代碼報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論