效能的提升
原始碼的升級
擁抱TypeScript
新的特性
Composition API(組合API)
新的內建元件
其他改變
相關推薦:《》
1.使用 vue-cli 建立
官方檔案:https://cli.vuejs.org/zh/guide/creating-a-project.html
## 檢視@vue/cli版本,確保@vue/cli版本在4.5.0以上 vue --version ## 安裝或者升級你的@vue/cli npm install -g @vue/cli ## 建立 vue create vue_test ## 啟動 cd vue_test npm run serve
2.使用 vite 建立
Vite 官方中文檔案:https://cn.vitejs.dev
傳統構建與vite構建對比圖:
## 建立工程 npm init vite-app <project-name> ## 進入工程目錄 cd <project-name> ## 安裝依賴 npm install ## 執行 npm run dev
官方檔案:https://v3.cn.vuejs.org/guide/composition-api-introduction.html
1.拉開序幕的setup
2.ref函數
import {ref} from "vue"
const xxx = ref(initValue)
xxx.value
.value
,直接<p>{{xxx}}</p>
Object.defineProperty()
的get
與set
完成的reactive
函數3.reactive函數
ref
函數)import {reactive} from 'vue'
const 代理物件 = reactive(源物件)
接收一個物件(或陣列),返回一個代理物件(Proxy的範例物件,簡稱proxy物件)4.Vue3.0中的響應式原理
Vue2.x的響應式
Object.defineProperty()
對屬性的讀取、修改進行攔截(資料劫持)Object.defineProperty(data, 'count', { get() {}, set() {}})
Vue3.0的響應式
new Proxy(data, { // 攔截讀取屬性值 get(target, prop) { return Reflect.get(target, prop) }, // 攔截設定屬性值或新增新屬性 set(target, prop, value) { return Reflect.set(target, prop, value) }, // 攔截刪除屬性 deleteProperty(target, prop) { return Reflect.deleteProperty(target, prop) }})proxy.name = 'tom'
5.reactive對比ref
reactive
轉為代理物件Object.defineProperty()
的get
與set
來實現響應式(資料劫持).value
,讀取資料時模板中直接讀取不需要.value
.value
6.setup的兩個注意點
setup執行的時機
setup的引數
this.$attrs
this.$slots
this.$emit
7.計算屬性與監視
computed函數
import { computed} from 'vue'setup() { ... // 計算屬性——簡寫 let fullName = computed(() => { return person.firstName + '-' + person.lastName }) // 計算屬性——完整 let fullName = computed({ get() { return person.firstName + '-' + person.lastName }, set(value) { const nameArr = value.split('-') person.firstName = nameArr[0] person.lastName = nameArr[1] } })}
watch函數
// 情況一:監視ref定義的響應式資料 watch(sum, (newValue, oldValue) => { console.log('sum變化了', newValue, oldValue) }, { immediate: true }) // 情況二:監視多個ref定義的響應式資料 watch([sum, msg], (newValue, oldValue) => { console.log('sum或msg變化了', newValue, oldValue) }) /* 情況三:監視reactive定義的響應式資料 若watch監視的是reactive定義的響應式資料,則無法正確獲得oldValue 若watch監視的是reactive定義的響應式資料,則強制開啟了深度監視 */ watch(person, (newValue, oldValue) => { console.log('person變化了', newValue, oldValue) }, { immediate: true, deep: false }) // 此處的deep設定不再奏效 // 情況四:監視reactive定義的響應式資料中的某個屬性 watch(() => person.job, (newValue, oldValue) => { console.log('person的job變化了', newValue, oldValue) }, { immediate: true, deep: true }) // 情況五:監視reactive定義的響應式資料中的某些屬性 watch([() => person.job, () => person.name], (newValue, oldValue) => { console.log('person的job變化了', newValue, oldValue) }, { immediate: true, deep: true }) // 特殊情況 watch(() => person.job, (newValue, oldValue) => { console.log('person的job變化了', newValue, oldValue) }, { deep: true }) // 此處由於監視的是reactive所定義的物件中的某個屬性,所以deep設定有效
watchEffect函數
// watchEffect所指定的回撥中用到的資料只要發生變化,則直接重新執行回撥 watchEffect(() => { const x1 = sum.value const x2 = person.age console.log('watchEffect設定的回撥執行了') })
8.生命週期
Vue2.x的生命週期:
Vue3.0的生命週期:
beforeDestroy
改名為beforeUnmount
destroyed
改名為unmounted
beforeCreate
===>setup()
created
===>setup()
beforeMount
===>onBeforeMount
mounted
===>onMounted
beforeUpdate
===>onBeforeUpdate
updated
===>onUpdated
beforeUnmount
===>onBeforeUnmount
unmounted
===>onUnmounted
9.自定義hook函數
10.toRef
const name = toRef(person, 'name')
toRefs
與toRef
功能一致,但可以批次建立多個 ref 物件,語法:toRefs(person)
1.shallowReactive 與 shallowRef
2.readonly 與 shallowReadonly
3.toRaw 與 markRaw
reactive
生成的響應式物件轉為普通物件4.customRef
<template> <input type="text" v-model="keyword"> <h3>{{keyword}}</h3> </template> <script> import { ref, customRef } from 'vue' export default { name: 'Demo', setup() { // let keyword = ref('hello') //使用Vue準備好的內建ref // 自定義一個myRef function myRef(value, delay) { let timer // 通過customRef去實現自定義 return customRef((track, trigger) => { return { get() { track() // 告訴Vue這個value值是需要被「追蹤」的 return value }, set(newValue) { clearTimeout(timer) timer = setTimeout(() => { value = newValue trigger() // 告訴Vue去更新介面 }, delay) } } }) } let keyword = myRef('hello', 500) // 使用程式設計師自定義的ref return { keyword } } } </script>
5.provide 與 inject
provide
選項來提供資料,後代元件有一個inject
選項來開始使用這些資料祖先元件中:
setup() { ...... let car = reactive({ name: '賓士', price: '40萬' }) provide('car', car) ......}
後代元件中:
setup(props, context) { ...... const car = inject('car') return { car } ......}
6.響應式資料的判斷
reactive
建立的響應式代理readonly
建立的唯讀代理reactive
或者readonly
方法建立的代理1.Options API 存在的問題
使用傳統OptionsAPI中,新增或者修改一個需求,就需要分別在data,methods,computed裡修改。
2.Composition API 的優勢
我們可以更加優雅地組織我們的程式碼、函數,讓相關功能的程式碼更加有序地組織在一起。
1.Fragment
2.Teleport
Teleport
是一種能夠將我們的元件html結構移動到指定位置的技術<teleport to="移動位置"> <div v-if="isShow" class="mask"> <div class="dialog"> <h3>我是一個彈窗</h3> <button @click="isShow = false">關閉彈窗</button> </div> </div> </teleport>
3.Suspense
非同步引入元件:
import { defineAsyncComponent } from 'vue' const Child = defineAsyncComponent(() => import('./components/Child.vue'))
使用Suspense
包裹元件,並設定好default
與fallback
:
<template> <div class="app"> <h3>我是App元件</h3> <Suspense> <template v-slot:default> <Child /> </template> <template v-slot:fallback> <h3>載入中...</h3> </template> </Suspense> </div> </template>
1.全域性API的轉移
// 註冊全域性元件 Vue.component('MyButton', { data: () => ({ count: 0 }), template: '<button @click="count++">Clicked {{ count }} times.</button>' }) // 註冊全域性指令 Vue.directive('focus', { inserted: el => el.focus() })
Vue.xxx
調整到應用範例(app
)上2.x全域性API(Vue ) | 3.x範例API(app ) |
---|---|
Vue.config.xxx | app.config.xxx |
Vue.config.productionTip | 移除 |
Vue.component | app.component |
Vue.directive | app.directive |
Vue.mixin | app.mixin |
Vue.use | app.use |
Vue.prototype | app.config.globalProperties |
2.其他改變
Vue2.x寫法:
.v-enter, .v-leave-to { opacity: 0;}.v-leave, .v-enter-to { opacity: 1;}
Vue3.x寫法:
.v-enter-from, .v-leave-to { opacity: 0;}.v-leave-from, .v-enter-to { opacity: 1;}
keyCode
作為v-on
的修飾符,同時也不再支援Vue.config.keyCodes.xxx
(按鍵別名)v-on.native
修飾符父元件中繫結事件:
<my-component v-on:close="handleComponentEvent" v-on:click="handleNativeClickEvent" />
子元件中宣告自定義事件:
<script> export default { emits: ['close'] // 這裡宣告的事件才算作自定義事件,所以在父元件中click是原生事件 } </script>
filter
以上就是VUE3快速上手及常用API函數彙總!的詳細內容,更多請關注TW511.COM其它相關文章!