国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

Vue 3.0 前瞻Vue Function API新特性體驗

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 21:52:34
文檔

Vue 3.0 前瞻Vue Function API新特性體驗

Vue 3.0 前瞻Vue Function API新特性體驗:最近 Vue 官方公布了 Vue 3.0 最重要的RFC:Function-based component API,并發(fā)布了兼容 Vue 2.0 版本的 plugin:vue-function-api,可用于提前體驗 Vue 3.0 版本的 Function-based component API。筆者出于學(xué)習(xí)的目的,提前在
推薦度:
導(dǎo)讀Vue 3.0 前瞻Vue Function API新特性體驗:最近 Vue 官方公布了 Vue 3.0 最重要的RFC:Function-based component API,并發(fā)布了兼容 Vue 2.0 版本的 plugin:vue-function-api,可用于提前體驗 Vue 3.0 版本的 Function-based component API。筆者出于學(xué)習(xí)的目的,提前在

最近 Vue 官方公布了 Vue 3.0 最重要的RFC:Function-based component API,并發(fā)布了兼容 Vue 2.0 版本的 plugin:vue-function-api,可用于提前體驗 Vue 3.0 版本的 Function-based component API。筆者出于學(xué)習(xí)的目的,提前在項目中嘗試了vue-function-api。

筆者計劃寫兩篇文章,本文為筆者計劃的第一篇,主要為筆者在體驗 Vue Function API 的學(xué)習(xí)心得。第二篇計劃寫閱讀vue-function-api的核心部分代碼原理,包括setup、observable、lifecycle。

本文閱讀時間約為15~20分鐘。

概述

Vue 2.x 及以前的高階組件的組織形式或多或少都會面臨一些問題,特別是在需要處理重復(fù)邏輯的項目中,一旦開發(fā)者組織項目結(jié)構(gòu)組織得不好,組件代碼極有可能被人詬病為“膠水代碼”。而在 Vue 2.x 及之前的版本,解決此類問題的辦法大致是下面的方案:

  • mixin
  • 函數(shù)式組件
  • slots
  • 筆者維護的項目也需要處理大量復(fù)用邏輯,在這之前,筆者一直嘗試使用mixin的方式來實現(xiàn)組件的復(fù)用。有些問題也一直會對開發(fā)者和維護者造成困惑,如一個組件同時mixin多個組件,很難分清對應(yīng)的屬性或方法寫在哪個mixin里。其次,mixin的命名空間沖突也可能造成問題。難以保證不同的mixin不用到同一個屬性名。為此,官方團隊提出函數(shù)式寫法的意見征求稿,也就是RFC:Function-based component API。使用函數(shù)式的寫法,可以做到更靈活地復(fù)用組件,開發(fā)者在組織高階組件時,不必在組件組織上考慮復(fù)用,可以更好地把精力集中在功能本身的開發(fā)上。

    注:本文只是筆者使用vue-function-api提前體驗 Vue Function API ,而這個 API 只是 Vue 3.0 的 RFC,而并非與最終 Vue 3.x API 一致。發(fā)布后可能有不一致的地方。

    在 Vue 2.x 中使用

    要想提前在Vue 2.x中體驗 Vue Function API ,需要引入vue-function-api,基本引入方式如下:

    import Vue from 'vue';
    import { plugin as VueFunctionApiPlugin } from 'vue-function-api';
    
    Vue.use(VueFunctionApiPlugin);
    
    

    基本組件示例

    先來看一個基本的例子:

    <template>
     <div>
     <span>count is {{ count }}</span>
     <span>plusOne is {{ plusOne }}</span>
     <button @click="increment">count++</button>
     </div>
    </template>
    
    <script>
    import Vue from 'vue';
    import { value, computed, watch, onMounted } from 'vue-function-api';
    
    export default {
     setup(props, context) {
     // reactive state
     const count = value(0);
     // computed state
     const plusOne = computed(() => count.value + 1);
     // method
     const increment = () => {
     count.value++;
     };
     // watch
     watch(
     () => count.value * 2,
     val => {
     console.log(`count * 2 is ${val}`);
     }
     );
     // lifecycle
     onMounted(() => {
     console.log(`mounted`);
     });
     // expose bindings on render context
     return {
     count,
     plusOne,
     increment,
     };
     },
    };
    </script>
    
    

    詳解

    setup

    setup函數(shù)是Vue Function API 構(gòu)建的函數(shù)式寫法的主邏輯,當(dāng)組件被創(chuàng)建時,就會被調(diào)用,函數(shù)接受兩個參數(shù),分別是父級組件傳入的props和當(dāng)前組件的上下文context。看下面這個例子,可以知道在context中可以獲取到下列屬性值:

    const MyComponent = {
     props: {
     name: String
     },
     setup(props, context) {
     console.log(props.name);
     // context.attrs
     // context.slots
     // context.refs
     // context.emit
     // context.parent
     // context.root
     }
    }
    

    value & state

    value函數(shù)創(chuàng)建一個包裝對象,它包含一個響應(yīng)式屬性value:

    那么為何要使用value呢,因為在JavaScript中,基本類型并沒有引用,為了保證屬性是響應(yīng)式的,只能借助包裝對象來實現(xiàn),這樣做的好處是組件狀態(tài)會以引用的方式保存下來,從而可以被在setup中調(diào)用的不同的模塊的函數(shù)以參數(shù)的形式傳遞,既能復(fù)用邏輯,又能方便地實現(xiàn)響應(yīng)式。

    直接獲取包裝對象的值必須使用.value,但是,如果包裝對象作為另一個響應(yīng)式對象的屬性,Vue內(nèi)部會通過proxy來自動展開包裝對象。同時,在模板渲染的上下文中,也會被自動展開。

    import { state, value } from 'vue-function-api';
    const MyComponent = {
     setup() {
     const count = value(0);
     const obj = state({
     count,
     });
     console.log(obj.count) // 作為另一個響應(yīng)式對象的屬性,會被自動展開
    
     obj.count++ // 作為另一個響應(yīng)式對象的屬性,會被自動展開
     count.value++ // 直接獲取響應(yīng)式對象,必須使用.value
    
     return {
     count,
     };
     },
     template: `<button @click="count++">{{ count }}</button>`,
    };
    
    

    如果某一個狀態(tài)不需要在不同函數(shù)中被響應(yīng)式修改,可以通過state創(chuàng)建響應(yīng)式對象,這個state創(chuàng)建的響應(yīng)式對象并不是包裝對象,不需要使用.value來取值。

    watch & computed

    watch和computed的基本概念與 Vue 2.x 的watch和computed一致,watch可以用于追蹤狀態(tài)變化來執(zhí)行一些后續(xù)操作,computed用于計算屬性,用于依賴屬性發(fā)生變化進行重新計算。

    computed返回一個只讀的包裝對象,和普通包裝對象一樣可以被setup函數(shù)返回,這樣就可以在模板上下文中使用computed屬性。可以接受兩個參數(shù),第一個參數(shù)返回當(dāng)前的計算屬性值,當(dāng)傳遞第二個參數(shù)時,computed是可寫的。

    import { value, computed } from 'vue-function-api';
    
    const count = value(0);
    const countPlusOne = computed(() => count.value + 1);
    
    console.log(countPlusOne.value); // 1
    
    count.value++;
    console.log(countPlusOne.value); // 2
    
    // 可寫的計算屬性值
    const writableComputed = computed(
     // read
     () => count.value + 1,
     // write
     val => {
     count.value = val - 1;
     },
    );
    
    

    watch第一個參數(shù)和computed類似,返回被監(jiān)聽的包裝對象屬性值,不過另外需要傳遞兩個參數(shù):第二個參數(shù)是回調(diào)函數(shù),當(dāng)數(shù)據(jù)源發(fā)生變化時觸發(fā)回調(diào)函數(shù),第三個參數(shù)是options。其默認行為與 Vue 2.x 有所不同:

  • lazy:是否會在組件創(chuàng)建時就調(diào)用一次回調(diào)函數(shù),與 Vue 2.x 相反,lazy默認是false,默認會在組件創(chuàng)建時調(diào)用一次。
  • deep:與 Vue 2.x 的 deep 一致
  • flush:有三個可選值,分別為 'post'(在渲染后,即nextTick后才調(diào)用回調(diào)函數(shù)),'pre'(在渲染前,即nextTick前調(diào)用回調(diào)函數(shù)),'sync'(同步觸發(fā))。默認值為'post'。
  • // double 是一個計算包裝對象
    const double = computed(() => count.value * 2);
    
    watch(double, value => {
     console.log('double the count is: ', value);
    }); // -> double the count is: 0
    
    count.value++; // -> double the count is: 2
    
    

    當(dāng)watch多個被包裝對象屬性時,參數(shù)均可以通過數(shù)組的方式進行傳遞,同時,與 Vue 2.x 的vm.$watch一樣,watch返回取消監(jiān)聽的函數(shù):

    const stop = watch(
     [valueA, () => valueB.value],
     ([a, b], [prevA, prevB]) => {
     console.log(`a is: ${a}`);
     console.log(`b is: ${b}`);
     }
    );
    stop();
    

    注意:在RFC:Function-based component API初稿中,有提到effect-cleanup,是用于清理一些特殊情況的副作用的,目前已經(jīng)在提案中被取消了。

    生命周期

    所有現(xiàn)有的生命周期都有對應(yīng)的鉤子函數(shù),通過onXXX的形式創(chuàng)建,但有一點不同的是,destoryed鉤子函數(shù)需要使用unmounted代替:

    import { onMounted, onUpdated, onUnmounted } from 'vue-function-api';
    
    const MyComponent = {
     setup() {
     onMounted(() => {
     console.log('mounted!');
     });
     onUpdated(() => {
     console.log('updated!');
     });
     // destroyed 調(diào)整為 unmounted
     onUnmounted(() => {
     console.log('unmounted!');
     });
     },
    };
    
    

    一些思考

    上面的詳解部分,主要抽取的是 Vue Function API 的常見部分,并非RFC:Function-based component API的全部,例如其中的依賴注入,TypeScript類型推導(dǎo)等優(yōu)勢,在這里,由于篇幅有限,想要了解更多的朋友,可以點開RFC:Function-based component API查看。個人也在Function-based component API討論區(qū)看到了更多地一些意見:

  • 由于底層設(shè)計,在setup取不到組件實例this的問題,這個問題在筆者嘗試體驗時也遇到了,期待正式發(fā)布的 Vue 3.x 能夠改進這個問題。
  • 對于基本類型的值必須使用包裝對象的問題:在 RFC 討論區(qū),為了同時保證TypeScript類型推導(dǎo)、復(fù)用性和保留Vue的數(shù)據(jù)監(jiān)聽,包裝屬性必須使用.value來取值是討論最激烈的
  • 關(guān)于包裝對象value和state方法命名不清晰可能導(dǎo)致開發(fā)者誤導(dǎo)等問題,已經(jīng)在Amendment proposal to Function-based Component API這個提議中展開了討論:
  • setup() {
     const state = reactive({
     count: 0,
     });
    
     const double = computed(() => state.count * 2);
    
     function increment() {
     state.count++;
     }
    
     return {
     ...toBindings(state), // retains reactivity on mutations made to `state`
     double,
     increment,
     };
    }
    
    
  • 引入reactive API 和 binding API,其中reactive API 類似于 state API , binding API 類似于 value API。
  • 之前使用的方法名state在 Vue 2.x 中可能被用作組件狀態(tài)對象,導(dǎo)致變量命名空間的沖突問題,團隊認為將state API 更名為 reactive 更為優(yōu)雅。開發(fā)者能夠?qū)懗鯿onst state = ... ,然后通過state.xxxx這種方式來獲取組件狀態(tài),這樣也相對而言自然一些。
  • value方法用于封裝基本類型時,確實會出現(xiàn)不夠優(yōu)雅的.value的情況,開發(fā)者可能會在直接對包裝對象取值時忘記使用.value,修正方案提出的 reactive API,其含義是創(chuàng)建響應(yīng)式對象,初始化狀態(tài)state就使用reactive創(chuàng)建,可保留每項屬性的getter和setter,這么做既滿足類型推導(dǎo),也可以保留響應(yīng)式引用,從而可在不同模塊中共享狀態(tài)值的引用。
  • 但reactive可能導(dǎo)致下面的問題,需要引入binding API。 解決,如使用reactive創(chuàng)建的響應(yīng)式對象,對其使用拓展運算符...時,則會丟失對象的getter和setter,提供toBindings方法能夠保留狀態(tài)的響應(yīng)式。
  • 下一篇文章中,筆者將閱讀vue-function-api的核心部分代碼原理,包括setup、observable、lifecycle等,從內(nèi)部探索 Vue Function API 可能帶給我們的改變。

    當(dāng)然,目前 Vue Function API 還處在討論階段,Vue 3.0 還處在開發(fā)階段,還是期待下半年 Vue 3.0 的初版問世吧,希望能給我們帶來更多的驚喜。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Vue 3.0 前瞻Vue Function API新特性體驗

    Vue 3.0 前瞻Vue Function API新特性體驗:最近 Vue 官方公布了 Vue 3.0 最重要的RFC:Function-based component API,并發(fā)布了兼容 Vue 2.0 版本的 plugin:vue-function-api,可用于提前體驗 Vue 3.0 版本的 Function-based component API。筆者出于學(xué)習(xí)的目的,提前在
    推薦度:
    標簽: VUE API 體驗
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品电影一区二区 | 日韩电影一区二区 | 一级毛片在线看在线播放 | 在线国产视频 | 日韩第3页 | 国产一二三区在线 | 欧美激情 在线 | 欧美国产成人精品一区二区三区 | 国产va在线播放 | 欧美射| 国产日韩在线观看视频网站 | 精品国产乱码一区二区三区麻豆 | 久久久久久久国产a∨ | 国产精品v欧美精品v日本精 | 欧美精品久久天天躁 | 久久夜色精品国产亚洲 | 在线国产一区二区三区 | 日韩欧美一区二区三区视频 | 91精品国产综合久久久久久 | 亚洲经典一区 | 国产精品日韩精品 | 国产69久久精品成人看小说 | 日本vs欧美一区二区三区 | 欧美 韩国 精品 另类 综合 | 欧美日韩高清在线 | 高清国产一区 | 国产区免费在线观看 | 精品欧美一区二区三区 | 亚洲日本一区二区三区高清在线 | 欧美a色爱欧美综合v | 国产精品第一 | 日韩区| 国产不卡一区二区视频免费 | 国产在线精彩视频 | 国产精品自在欧美一区 | 国产精品资源在线播放 | 国产成人无精品久久久久国语 | 波多野结衣系列在线观看 | 精品一区二区三区免费视频 | 日韩在线国产 | 一久久|