最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

(一)響應(yīng)式數(shù)據(jù)

1. 簡(jiǎn)單例子

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

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

<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 實(shí)現(xiàn)的話,則是這樣:

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

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

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

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

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

而 Vue3 的等效實(shí)現(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. 對(duì)比分析

寫(xiě)了太多 Vue 的我們可能已經(jīng)忘了,Vue2 的代碼從標(biāo)準(zhǔn) JS 模塊的角度來(lái)看有多奇怪:

  • mounted 中修改的 this.now 數(shù)據(jù)是在哪創(chuàng)建的?我們?cè)谀K default 對(duì)象的成員里并沒(méi)有找到對(duì)應(yīng)字段,倒是在 data 內(nèi)返回的另一個(gè)對(duì)象中有這個(gè)字段;
  • data 中返回的 now 也不是真正的 this.now,而是 this.now 的初始值,在 data setInterval 修改 now 并不能更新渲染出來(lái)的時(shí)間;
  • 如果想復(fù)用這個(gè)數(shù)據(jù)和它的更新邏輯,你必須將這樣的結(jié)構(gòu)單獨(dú)寫(xiě)一份,然后通過(guò)特殊的 mixin 函數(shù)混入到當(dāng)前組件的構(gòu)造參數(shù)內(nèi)。

這一切,是因?yàn)檎麄€(gè)模塊 default 對(duì)象其實(shí)是 vm 對(duì)象的構(gòu)造參數(shù)。其背后隱藏了對(duì)象的創(chuàng)建邏輯,在構(gòu)造對(duì)象時(shí)構(gòu)造參數(shù)中的一些不同層級(jí)的字段被綁定到了 vm 對(duì)象上。

不少新手可能都犯過(guò)一個(gè)錯(cuò)誤,在 data 中返回的數(shù)據(jù)字段和 propsmethods 或者 computed 中的字段命名撞車(尤其是使用名為 data 的字段),在編碼階段并不能被 IDE 直接發(fā)現(xiàn)。就是因?yàn)樯厦娴脑颍@些字段創(chuàng)建時(shí)隸屬于不同的位置,在之后構(gòu)造時(shí)才被綁在了同一個(gè)對(duì)象上,導(dǎo)致了運(yùn)行時(shí)才能發(fā)現(xiàn)的沖突。

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

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

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

4. API 說(shuō)明

下面詳細(xì)說(shuō)說(shuō)常用的幾個(gè)響應(yīng)式數(shù)據(jù)相關(guān) API:ref, reactive toRefs

(1) ref

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

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

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

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

(2) reactive

對(duì)于對(duì)象的響應(yīng)式封裝,使用 ref 稍顯麻煩:

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

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

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

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

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

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

(3) toRefs

有時(shí)候,對(duì)象的名字過(guò)長(zhǎng),我們想直接在模板內(nèi)使用對(duì)象內(nèi)部字段,直接使用解構(gòu)是不行的:

import { reactive } from 'vue';

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

這個(gè)情況下,使用 toRefs 處理后再解構(gòu)賦值即可:

import { reactive, toRefs } from 'vue';

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

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

以上就是淺析 Vue 3.0 的組裝式 API(一)的詳細(xì)內(nèi)容,更多關(guān)于Vue 組裝式 API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車案例

    Vue實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車案例

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Vue使用鼠標(biāo)在Canvas上繪制矩形

    Vue使用鼠標(biāo)在Canvas上繪制矩形

    這篇文章主要介紹了Vue使用鼠標(biāo)在Canvas上繪制矩形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • vue 解決data中定義圖片相對(duì)路徑頁(yè)面不顯示的問(wèn)題

    vue 解決data中定義圖片相對(duì)路徑頁(yè)面不顯示的問(wèn)題

    這篇文章主要介紹了vue 解決data中定義圖片相對(duì)路徑頁(yè)面不顯示的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Vue使用Element實(shí)現(xiàn)增刪改查+打包的步驟

    Vue使用Element實(shí)現(xiàn)增刪改查+打包的步驟

    這篇文章主要介紹了Vue使用Element實(shí)現(xiàn)增刪改查+打包的步驟,幫助大家更好的理解和學(xué)習(xí)vue框架,感興趣的朋友可以了解下
    2020-11-11
  • Vue動(dòng)態(tài)創(chuàng)建注冊(cè)component的實(shí)例代碼

    Vue動(dòng)態(tài)創(chuàng)建注冊(cè)component的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Vue動(dòng)態(tài)創(chuàng)建注冊(cè)component的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Vue3源碼通過(guò)render?patch?了解diff

    Vue3源碼通過(guò)render?patch?了解diff

    這篇文章主要為大家介紹了Vue3源碼系列通過(guò)render及patch了解diff原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • vue鍵盤(pán)事件點(diǎn)擊事件加native操作

    vue鍵盤(pán)事件點(diǎn)擊事件加native操作

    這篇文章主要介紹了vue鍵盤(pán)事件點(diǎn)擊事件加native操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 解決vue中el-tab-pane切換的問(wèn)題

    解決vue中el-tab-pane切換的問(wèn)題

    這篇文章主要介紹了解決vue中el-tab-pane切換的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Vue數(shù)組中出現(xiàn)__ob__:Observer無(wú)法取值問(wèn)題的解決方法

    Vue數(shù)組中出現(xiàn)__ob__:Observer無(wú)法取值問(wèn)題的解決方法

    __ob__: Observer這個(gè)屬性其實(shí)是Vue監(jiān)控變量產(chǎn)生的,下面這篇文章主要給大家介紹了關(guān)于Vue數(shù)組中出現(xiàn)__ob__:?Observer無(wú)法取值問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • el-menu修改item顏色的實(shí)現(xiàn)

    el-menu修改item顏色的實(shí)現(xiàn)

    本文主要介紹了el-menu修改item顏色的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

湘阴县| 赫章县| 隆尧县| 南丰县| 太保市| 宁安市| 广昌县| 伊宁县| 娄烦县| 阿尔山市| 河间市| 河东区| 沈阳市| 天等县| 扶绥县| 潮安县| 晋州市| 建阳市| 正安县| 西盟| 苍山县| 南涧| 措美县| 岐山县| 孝感市| 湄潭县| 湖南省| 西峡县| 尉氏县| 子长县| 鹤岗市| 张家川| 榕江县| 武平县| 峨边| 葵青区| 晋宁县| 黑龙江省| 平陆县| 潜山县| 丹棱县|