vue3.0 支持組件中使用多個根節點,能夠減小節點層級深度,也但願開發者可以明確語義javascript
vue3.0 刪除了過濾器(filters),將不在支持,官方建議使用計算屬性(computed)替換過濾器html
vue3.0 暴露出不少 API 供開發者使用,能夠根據需求,將所須要的 API 從 Vue 中導入。考慮到 tree-shaking,利用了 import 和 export 的語法,實現了按需打包模塊的功能vue
vue3.0 中新增了一個新的全局 API createApp,調用 createApp 返回一個應用實例,該應用實例暴露出來全局 API(vue3.0 將能夠全局改變 Vue 行爲的 API 從原來的 Vue 構造函數上轉移到了實例上了)java
//vue2.0建立import Vue from 'vue'import App from './App.vue' Vue.config.productionTip = false new Vue({ render: h => h(App), }).$mount('#app') //vue3.0建立import { createApp } from 'vue'import App from './App.vue' createApp(App).mount('#app');複製代碼
Object.defineProperty 只能監聽到屬性的讀寫,而 Proxy 除讀寫外還能夠監聽屬性的刪除,方法的調用等react
Vue 組合式 API:composition-api.vuejs.org/zh/api.html…git
setup 函數是一個新的組件選項,做爲在組件內使用 Composition API 的入口函數,變量、方法都定義在該函數中github
<template> <div> {{ count }} {{ obj.count }} </div></template><script>//引入須要的APIimport { ref, reactive } from 'vue'export default { name: 'home', setup() { const count = ref(0) export let obj = reactive({ count: 0 }) //經過return暴露出去,供template中使用 return { count, obj } } }</script><style scoped> </style>複製代碼
使用 <script setup>vue-router
<template> <div> {{ count }} {{ obj.count }} </div></template><script setup>//引入須要的APIimport { ref, reactive } from 'vue'//經過export暴露出去,供template中使用export let num = ref(0)export let obj = reactive({ count: 0 })</script><style scoped> </style>複製代碼
reactive 接收一個普通對象而後返回該普通對象的響應式代理,建立一個響應式的數據對象vue-cli
<template> <div> {{ obj.count }} </div></template><script>//引入須要的APIimport { reactive } from 'vue'export default { name: 'home', setup() { //經過reactive定義響應式對象 const obj = reactive({ count: 0 }) //經過return暴露出去,供template中使用 return { obj } } }</script>複製代碼
ref 接受一個參數值並返回一個響應式且可改變的 ref 對象。ref 對象擁有一個指向內部值的單一屬性 .valuenpm
<template> <div> {{ count }} </div></template><script>//引入須要的APIimport { ref } from 'vue'export default { name: 'home', setup() { //經過ref定義響應式對象 const count = ref(0) //經過value屬性訪問值 console.log(count.value) //0 //經過return暴露出去,供template中使用 return { count } } }</script>複製代碼
toRef 能夠用來爲一個 reactive 對象的屬性建立一個 ref,這個 ref 能夠被傳遞而且可以保持響應性(將 reactive 對象中的某個值轉化爲響應式數據)
與 ref 的區別:
<script>//引入須要的APIimport { reactive, toRef } from 'vue'export default { name: 'home', setup() { //經過reactive定義響應式對象 const obj = reactive({ count: 0, name: '廊坊吳彥祖' }) //經過toRef將obj中的count屬性建立爲ref const count = toRef(obj, 'count') //經過return暴露出去,供template中使用 return { obj, count } } } </script>複製代碼
toRefs 把一個響應式對象轉換成普通對象,該普通對象的每一個屬性都是一個 ref ,和響應式對象屬性一一對應(將 reactive 對象中的全部值轉化爲響應式數據)
<script>//引入須要的APIimport { reactive, toRefs } from 'vue'export default { name: 'home', setup() { //經過reactive定義響應式對象 const obj = reactive({ count: 0, name: '廊坊吳彥祖' }) //經過toRefs將obj中的全部屬性建立爲ref const refObj = toRefs(obj) console.log(refObj) //經過return暴露出去,供template中使用 return { obj, refObj } } } </script>複製代碼
console.log(refObj):
readonly 傳入一個對象(響應式或普通)或 ref,返回一個原始對象的只讀代理(沒法修改)
<template> <div> {{ count }} </div></template><script>//引入須要的APIimport { readonly } from 'vue'export default { name: 'home', setup() { //經過readonly定義只讀對象 const count = readonly(0) count.value++ //修改報錯!Cannot create property 'value' on number '0' //經過return暴露出去,供template中使用 return { count } } }</script>複製代碼
computed(計算屬性)傳入一個 getter 函數,返回一個默認不可手動修改的 ref 對象,使用和 vue 2.0 區別不大
<template> <div> {{ count }} {{ addCount }} </div></template><script>//引入須要的APIimport { ref, computed } from 'vue'export default { name: 'home', setup() { //經過ref定義響應式對象 const count = ref(0) //經過computed方法實現計算屬性 const addCount = computed(() => count.value + 1) console.log(addCount.value) //1 //經過return暴露出去,供template中使用 return { count, addCount } } }</script>複製代碼
watch(偵聽器)須要偵聽特定的數據源,並在回調函數中執行反作用,使用和 vue 2.0 區別不大
<script>//引入須要的APIimport { ref, reactive, watch } from 'vue'export default { name: 'home', setup() { //經過ref定義響應式對象 const count = ref(0) //經過watch方法實現對count的數據偵聽 watch(count, (newVal, oldVal) => { console.log('newVal:' + newVal) console.log('oldVal:' + oldVal) }) //經過reactive定義響應式對象 const obj = reactive({ count: 0 }) //經過watch方法實現對obj.count的數據偵聽 watch(() => obj.count, (newVal, oldVal) => { console.log('newVal:' + newVal) console.log('oldVal:' + oldVal) }) //經過watch方法實現同時對count和obj.count的數據偵聽 watch([count, () => obj.count], ([newVal1, oldVal1], [newVal2, oldVal2]) => { console.log('newVal1:' + newVal1) console.log('oldVal1:' + oldVal1) console.log('newVal2:' + newVal2) console.log('oldVal3:' + oldVal2) }) //經過return暴露出去,供template中使用 return { count, obj } } } </script>複製代碼
watchEffect 當即執行傳入的一個函數,並響應式追蹤其依賴,並在其依賴變動時從新運行該函數
//watchEffect方法返回stop方法,執行該方法中止偵聽const stop = watchEffect(() => { ...... }) //中止偵聽stop()複製代碼
與 watch 的區別:
<script>//引入須要的APIimport { ref, reactive, watchEffect } from 'vue'export default { name: 'home', setup() { //經過ref定義響應式對象 const count = ref(0) //經過reactive定義響應式對象 const obj = reactive({ count: 0 }) //經過watchEffect方法實現數據偵聽(只能獲得變化後的值) watchEffect(() => { console.log(count.value) console.log(obj.name) }) //經過return暴露出去,供template中使用 return { count, obj } } } </script>複製代碼
使用組合式 API 時,reactive refs 和 template refs 的概念已是統一的。爲了得到對模板內元素或組件實例的引用,須要在 setup() 中聲明一個值爲 null 的 ref 並返回它
<template> <div ref="box"></div></template><script>//引入須要的APIimport { ref, onMounted } from 'vue'export default { name: 'home', setup() { //經過ref(null)獲取指定元素 const box = ref(null) onMounted(() => { console.log(box.value) //<div></div> }) //經過return暴露出去,供template中使用 return { box } } }</script>複製代碼
vue3.0 生命週期部分有所變化(setup 函數代替了 beforeCreate 和 created 兩個生命週期函數,在生命週期 beforeCreate 以前被調用)
vue 2.0 | vue3.0 |
---|---|
beforeCreate | setup |
created | setup |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeDestory | onBeforeUnmount |
destoryed | onUnmounted |
使用 vue3.0 的生命週期,一樣須要先從 vue 中導入,再在 setup 函數中使用
<script>//引入生命週期import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, unMounted } from 'vue' export default { name: 'home', setup() { //組件掛載前 onBeforeMount(() => { ...... }) //組件掛載先後 onMounted(() => { ...... }) //組件更新前 onBeforeUpdate(() => { ...... }) //組件更新後 onUpdated(() => { ...... }) //組件銷燬前 onBeforeUnmount(() => { ...... }) //組件銷燬後 unMounted(() => { ...... }) return { ...... } } } </script>複製代碼
npm install @vue/composition-api --save
import Vue from 'vue'import App from './App.vue'//引入@vue/composition-apiimport VueCompositionAPI from '@vue/composition-api'Vue.use(VueCompositionAPI) Vue.config.productionTip = falsenew Vue({ render: h => h(App), }).$mount('#app')複製代碼
vue create vue3.0-demo
選擇 Vue 3
vue3.0 下 vue-router4.0 相關 API:
//引入路由相關APIimport { createRouter, createWebHashHistory } from 'vue-router'import Home from '../views/home/index.vue'import About from '../views/about/index.vue'//建立hash路由模式const routerHashHistory = createWebHashHistory()//建立路由實例const router = createRouter({history: routerHashHistory,routes: [ {name: 'home',path: '/',component: Home }, {name: 'about',path: '/about',component: About } ] })export default router複製代碼
import { createApp } from 'vue'import App from './App.vue'//引入路由實例import router from './router'//將路由實例注入到vue根實例中createApp(App).use(router).mount('#app')複製代碼