Vue 3.0 有哪些新特性值得我們提前了解

一、迎接 Vue 3.0
1. 簡介















? Vue.js 作者兼核心開發(fā)者尤雨溪宣布 Vue 3.0 進入 Beta 階段。

    已合并所有計劃內(nèi)的 RFC
    已實現(xiàn)所有被合并的 RFC
    Vue CLI 現(xiàn)在通過 vue-cli-plugin-vue-next 提供了實驗性支持

2. 新特性

? 重點關注:

    更快更省

    Object.defineProperty ——> Proxy

    重構 Virtual DOM

    完全的TypeScript

    團隊開發(fā)更輕松

    架構更靈活,閱讀源碼更輕松

    可以獨立使用Vue內(nèi)部模塊

    Composition API(組合式API)

    一組低侵入式的、函數(shù)式的 API

    更好的邏輯復用與代碼組織

    更好的類型推導

3. 參考資源

    https://github.com/vuejs/vue-next
    https://vue-composition-api-rfc.netlify.app/

二、初始化項目

    系統(tǒng)環(huán)境

    npm -v
    nrm ls


    安裝@vue/cli

    npm install @vue/cli -g


    創(chuàng)建項目

    vue create 項目名


    在項目中安裝 vue-next插件,試用Vue3 beta

    vue add vue-next


    項目變化

    import { createApp } from 'vue';
    import App from './App.vue'

    createApp(App).mount('#app')


    啟動項目

    npm run serve


? 補充:

    vue-devtools 暫不支持Vue 3.0
    VSCode中安裝Vue 3 Snippets插件

三、setup函數(shù)

? setup 函數(shù)是一個新的組件選項。作為在組件內(nèi)使用 Composition API 的入口點。
1. 調(diào)用時機

? setup 函數(shù)會在 beforeCreate 鉤子之前被調(diào)用
2. 返回值

? 如果 setup 返回一個對象,則對象的屬性可以在組件模板中被訪問
3. 參數(shù)

? 第一個參數(shù)為 props,接收當前組件props選項的值,即獲取父組件傳遞過來的參數(shù)

export default {
  props: {
    name: String,
  },
  setup(props) {
    console.log(props.name)
  },
}



? 第二個參數(shù)為context,接收一個上下文對象,該對象中包含了一些在vue 2.x 中需要通過 this 才能訪問到屬性

const MyComponent = {
  setup(props, context) {
    context.attrs
    context.slots
    context.emit
  }
}



? 注:在 setup() 函數(shù)中無法訪問 this
四、響應式系統(tǒng)API

? Vue 3.0提供的一組具有響應式特性的函數(shù)式API,都是以函數(shù)形式提供的
1. reactive

? reactive()函數(shù)接收一個普通對象,返回該普通對象的響應式代理對象

? 簡單來說,就是用來創(chuàng)建響應式的數(shù)據(jù)對象,等同于vue 2.x 的 Vue.observable()函數(shù)

? 步驟:

    按需導入 reactive 函數(shù)

    import { reactive } from 'vue'


    調(diào)用 reactive 函數(shù),創(chuàng)建響應式數(shù)據(jù)對象

    setup() {
         // 創(chuàng)建響應式數(shù)據(jù)對象
        const data = reactive({count: 0})

         // 將響應式數(shù)據(jù)對象暴露出去
        return data;
    }


2. ref

? ref()函數(shù)接收一個參數(shù)值,返回一個響應式的數(shù)據(jù)對象。該對象只包含一個指向內(nèi)部值的 .value 屬性

    基本用法
    在模板中訪問時,無需通過.value屬性,它會自動展開
    在reactive對象中訪問時,無需通過.value屬性,它會自動展開

3. computed

? computed() 函數(shù)用來創(chuàng)建計算屬性,函數(shù)的返回值是一個 ref 的實例

    只讀的計算屬性
    可讀可寫的計算屬性

4. readonly

? readonly()函數(shù)接收一個對象(普通或響應式),返回一個原始對象的只讀代理對象
5. watch

? watch() 函數(shù)用來監(jiān)視數(shù)據(jù)的變化,從而觸發(fā)特定的操作,等同于 vue 2.x中的 this.$watch

    監(jiān)視單個數(shù)據(jù)源
    監(jiān)視多個數(shù)據(jù)源
    取消監(jiān)視
    清除無效的異步任務

6. watchEffect

? watchEffect()函數(shù)接收一個函數(shù)作為參數(shù),并立即執(zhí)行該函數(shù),同時響應式追蹤其依賴,并在其依賴變更時重新運行該函數(shù)。
五、響應式系統(tǒng)工具集
1. isRef

? 檢查一個值是否為一個 ref 對象。
2. isReactive

? 檢查一個對象是否是由 reactive 創(chuàng)建的響應式代理。
3. isReadonly

? 檢查一個對象是否是由 readonly 創(chuàng)建的只讀代理。
4. isProxy

? 檢查一個對象是否是由 reactive 還是 readonly 方法創(chuàng)建的代理。
5.unref

? 如果參數(shù)是一個 ref 則返回它的 value,否則返回參數(shù)本身。它是 val = isRef(val) ? val.value : val 的語法糖。
6. toRef

? toRef()函數(shù)用來將 reactive 對象的一個屬性創(chuàng)建為一個 ref,并且這個 ref 具有響應性,可以被傳遞。
7. toRefs

? toRefs()函數(shù)用來將 reactive 對象創(chuàng)建為一個普通對象,但該普通對象的每個屬性都是一個 ref,并且這個 ref 具有響應性,可以被傳遞。
六、生命周期鉤子函數(shù)

? Vue 3.0 中的生命周期函數(shù)和 Vue 2.x 相比做了一些調(diào)整和變化,對應關系如下:

    beforeCreate -> 使用 setup()
    created -> 使用 setup()
    beforeMount -> onBeforeMount
    mounted -> onMounted
    beforeUpdate -> onBeforeUpdate
    updated -> onUpdated
    beforeDestroy -> onBeforeUnmount
    destroyed -> onUnmounted
    errorCaptured -> onErrorCaptured

? 這些生命周期鉤子函數(shù)只能在 setup() 函數(shù)中使用
七、依賴注入

? 依賴注入就是祖先組件向后代組件傳遞數(shù)據(jù),使用provide() 和 inject() 函數(shù)來實現(xiàn),功能類似 vue 2.x中的 provide/inject

? 這兩個函數(shù)只能在 setup() 函數(shù)中使用:

    在祖先組件中使用provide()函數(shù)向下傳遞數(shù)據(jù)
    在后代組件中使用inject()函數(shù)獲取上層傳遞過來的數(shù)據(jù)

八、模板 Refs

? 通過 ref()函數(shù)還可以引用頁面上的元素或組件,功能類似于 vue 2.x中的 vm.$refs

? 步驟:

    在 setup() 中創(chuàng)建一個 ref 對象并返回它
    在頁面上為元素添加 ref 屬性,并設置屬性值與創(chuàng)建的 ref 對象的名稱相同
    當頁面渲染完成后,可以通過該 ref 對象獲取到頁面中對應的DOM元素

作者:Vam的金豆之路

主要領域:前端開發(fā)

我的微信:maomin9761

微信公眾號:前端歷劫之路