亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Vue 3.0 前瞻,體驗 Vue Function API

DrizzleX / 980人閱讀

摘要:與的一致有三個可選值,分別為在渲染后,即后才調用回調函數(shù),在渲染前,即前調用回調函數(shù),同步觸發(fā)。

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

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

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

概述

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

mixin

函數(shù)式組件

slots

筆者維護的項目也需要處理大量復用邏輯,在這之前,筆者一直嘗試使用mixin的方式來實現(xiàn)組件的復用。有些問題也一直會對開發(fā)者和維護者造成困惑,如一個組件同時mixin多個組件,很難分清對應的屬性或方法寫在哪個mixin里。其次,mixin的命名空間沖突也可能造成問題。難以保證不同的mixin不用到同一個屬性名。為此,官方團隊提出函數(shù)式寫法的意見征求稿,也就是RFC:Function-based component API。使用函數(shù)式的寫法,可以做到更靈活地復用組件,開發(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);
基本組件示例

先來看一個基本的例子:



詳解 setup

setup函數(shù)是Vue Function API 構建的函數(shù)式寫法的主邏輯,當組件被創(chuàng)建時,就會被調用,函數(shù)接受兩個參數(shù),分別是父級組件傳入的props和當前組件的上下文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)建一個包裝對象,它包含一個響應式屬性value

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

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

import { state, value } from "vue-function-api";
const MyComponent = {
    setup() {
        const count = value(0);
        const obj = state({
            count,
        });
        console.log(obj.count) // 作為另一個響應式對象的屬性,會被自動展開

        obj.count++ // 作為另一個響應式對象的屬性,會被自動展開
        count.value++ // 直接獲取響應式對象,必須使用.value

        return {
            count,
        };
    },
    template: ``,
};

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

watch & computed

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

computed返回一個只讀的包裝對象,和普通包裝對象一樣可以被setup函數(shù)返回,這樣就可以在模板上下文中使用computed屬性。可以接受兩個參數(shù),第一個參數(shù)返回當前的計算屬性值,當傳遞第二個參數(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ù)是回調函數(shù),當數(shù)據(jù)源發(fā)生變化時觸發(fā)回調函數(shù),第三個參數(shù)是options。其默認行為與 Vue 2.x 有所不同:

lazy:是否會在組件創(chuàng)建時就調用一次回調函數(shù),與 Vue 2.x 相反,lazy默認是false,默認會在組件創(chuàng)建時調用一次。

deep:與 Vue 2.x 的 deep 一致

flush:有三個可選值,分別為 "post"(在渲染后,即nextTick后才調用回調函數(shù)),"pre"(在渲染前,即nextTick前調用回調函數(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

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: $`);
    }
);

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

所有現(xiàn)有的生命周期都有對應的鉤子函數(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 調整為 unmounted
        onUnmounted(() => {
            console.log("unmounted!");
        });
    },
};
一些思考

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

由于底層設計,在setup取不到組件實例this的問題,這個問題在筆者嘗試體驗時也遇到了,期待正式發(fā)布的 Vue 3.x 能夠改進這個問題。

對于基本類型的值必須使用包裝對象的問題:在 RFC 討論區(qū),為了同時保證TypeScript類型推導、復用性和保留Vue的數(shù)據(jù)監(jiān)聽,包裝屬性必須使用.value來取值是討論最激烈的

關于包裝對象valuestate方法命名不清晰可能導致開發(fā)者誤導等問題,已經在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)對象,導致變量命名空間的沖突問題,團隊認為將state API 更名為 reactive 更為優(yōu)雅。開發(fā)者能夠寫出const state = ... ,然后通過state.xxxx這種方式來獲取組件狀態(tài),這樣也相對而言自然一些。

value方法用于封裝基本類型時,確實會出現(xiàn)不夠優(yōu)雅的.value的情況,開發(fā)者可能會在直接對包裝對象取值時忘記使用.value,修正方案提出的 reactive API,其含義是創(chuàng)建響應式對象,初始化狀態(tài)state就使用reactive創(chuàng)建,可保留每項屬性的gettersetter,這么做既滿足類型推導,也可以保留響應式引用,從而可在不同模塊中共享狀態(tài)值的引用。

reactive可能導致下面的問題,需要引入binding API。 解決,如使用reactive創(chuàng)建的響應式對象,對其使用拓展運算符...時,則會丟失對象的gettersetter,提供toBindings方法能夠保留狀態(tài)的響應式。

下一篇文章中,筆者將閱讀vue-function-api的核心部分代碼原理,包括setup、observable、lifecycle等,從內部探索 Vue Function API 可能帶給我們的改變。

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/106643.html

相關文章

  • 面向未來編程(Future-Oriented Programming),建設未來 Vue 生態(tài)

    摘要:狀態(tài)管理社區(qū)當前最流行的狀態(tài)管理方案分別是單向數(shù)據(jù)流的和基于的。目前的現(xiàn)狀主要是由于并沒有將其底層的曝光出來。是一個開源項目,完全兼容的,擁簇面向未來編程,致力于加速未來生態(tài)圈的建設。 概要 Vue 的作者尤雨溪最近公布了 3.0 版本最重要的 RFC Vue Function-based API。在 React 推出 Hooks 后不久,Vue 社區(qū)也迎來了自己的組件邏輯復用機制。 ...

    J4ck_Chan 評論0 收藏0
  • 預計今年發(fā)布的Vue3.0到底有什么不一樣的地方?

    摘要:模板語法的將保持不變?;诘挠^察者機制目前,的反應系統(tǒng)是使用的和。為了繼續(xù)支持,將發(fā)布一個支持舊觀察者機制和新版本的構建。 showImg(https://segmentfault.com/img/remote/1460000017862774?w=1898&h=796); 還有幾個月距離vue2的首次發(fā)布就滿3年了,而vue的作者尤雨溪也在去年年末發(fā)布了關于vue3.0的計劃,如果不...

    fnngj 評論0 收藏0
  • 精讀《Vue3.0 Function API

    摘要:拿到的都是而不是原始值,且這個值會動態(tài)變化。精讀對于的與,筆者做一些對比。因此采取了作為優(yōu)化方案只有當?shù)诙€依賴參數(shù)變化時才返回新引用。不需要使用等進行性能優(yōu)化,所有性能優(yōu)化都是自動的。前端精讀幫你篩選靠譜的內容。 1. 引言 Vue 3.0 的發(fā)布引起了軒然大波,讓我們解讀下它的 function api RFC 詳細了解一下 Vue 團隊是怎么想的吧! 首先官方回答了幾個最受關注的...

    voyagelab 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<