這篇文章主要介紹關(guān)于Vue3.0的知識點分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)建站是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計公司的優(yōu)秀設(shè)計人員和策劃人員組成的一個具有豐富經(jīng)驗的團(tuán)隊,其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計師、平面廣告設(shè)計師、網(wǎng)絡(luò)營銷人員及形象策劃。承接:成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)頁設(shè)計制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫開發(fā),以高性價比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務(wù)。
今天這篇文章主要講解了以下內(nèi)容:
Vue3.0中使用watchVue3.0中使用計算屬性Vue3.0中使用vue-routerVue3.0中使用vuex開始本文前,小編提供了一個Vue3.0開發(fā)環(huán)境,倉庫地址為 gitee.com/f_zijun/vue…,歡迎使用。本文首發(fā)于公眾號【前端有的玩】,這是一個專注于Vue與面試相關(guān)的公眾號,提升自己的市場競爭力,就在【前端有的玩】。同時點擊以下鏈接即可訪問小編關(guān)于Vue3.0的其他相關(guān)文章
學(xué)習(xí)Vue3.0,先來了解一下Proxy
使用vite搭建一個Vue3.0學(xué)習(xí)環(huán)境
使用Vue3.0收獲的知識點(一)
Vue3.0中使用watchwatch在Vue3.0中并不是一個新的概念,在使用Vue2.x的時候,我們經(jīng)常會使用watch來監(jiān)聽Vue實例上面的一個表達(dá)式或者一個函數(shù)計算結(jié)果的變化。
Vue2.0中的watch在Vue2.0中,我們使用watch可以通過下面多種方式去監(jiān)聽Vue實例上面的表達(dá)式或者函數(shù)計算結(jié)果的變化,如下羅列了其中的幾種
最常規(guī)使用方式
export default {
data() { return { name: '子君', info: { gzh: '前端有的玩'
}
}
}, watch: {
name(newValue, oldValue) { console.log(newValue, oldValue)
}, 'info.gzh': {
handler(newValue, oldValue) { console.log(newValue, oldValue)
}, // 配置immediate會在watch之后立即執(zhí)行
immediate: true
}
}
}復(fù)制代碼我們可以在watch屬性里面配置要監(jiān)聽的Vue實例上面的屬性,也可以通過.鍵路徑去監(jiān)聽對象中的某一個屬性的變化,也可以通過配置immediate在監(jiān)聽后立即觸發(fā),配置deep去深度監(jiān)聽對象里面的屬性,不論嵌套層級有多深。
使用$watch監(jiān)聽
除了常規(guī)的watch對象寫法之外,Vue實例上面提供了$watch方法,可以通過$watch更靈活的去監(jiān)聽某一個屬性的變化。比如這樣一個場景,我們有一個表單,然后希望在用戶修改表單之后可以監(jiān)聽到表單的數(shù)據(jù)變化。但是有一個特殊的場景,就是表單的回填數(shù)據(jù)是異步請求過來的,這時候我們希望在后臺請求完數(shù)據(jù)之后再去監(jiān)聽變化,這時候就可以使用$watch。如下代碼所示:
export default { methods: {
loadData() {
fetch().then(data => { this.formData = data this.$watch( 'formData',
() => { // formData數(shù)據(jù)發(fā)生變化后會進(jìn)入此回調(diào)函數(shù)
},
{ deep: true
}
)
})
}
}
}復(fù)制代碼監(jiān)聽函數(shù)表達(dá)式
除了監(jiān)聽字符串之外,$watch的第一個參數(shù)也可以是一個函數(shù),當(dāng)函數(shù)的返回值發(fā)生變化之后,觸發(fā)回調(diào)函數(shù)
this.$watch(() => this.name, () => { // 函數(shù)的返回值發(fā)生變化,進(jìn)入此回調(diào)函數(shù)})復(fù)制代碼上文中就是Vue2.0中我們使用watch的一些常用寫法,對于Vue3.0,因為其對Vue2.0做了部分的向下兼容,所以上面的用法在Vue3.0中基本都可以使用,但是Vue3.0一個很大的亮點就是composition API,所以除了Vue2.0中的寫法之外,也可以使用componsition api中提供的watch
Vue3.0中使用watch在Vue3.0中,除了Vue2.0的寫法之外,有兩個api可以對數(shù)據(jù)變化進(jìn)行監(jiān)聽,第一種是watch,第二種是watchEffect。對于watch,其與Vue2.0中的$watch用法基本是一模一樣的,而watchEffect是Vue3.0新提供的api
下面的示例演示了如何使用watch
import { watch, ref, reactive } from 'vue'export default {
setup() { const name = ref('子君') const otherName = reactive({ firstName: '王', lastName: '二狗'
})
watch(name, (newValue, oldValue) => { // 輸出 前端有的玩 子君
console.log(newValue, oldValue)
}) // watch 可以監(jiān)聽一個函數(shù)的返回值
watch( () => { return otherName.firstName + otherName.lastName
},
value => { // 當(dāng)otherName中的 firstName或者lastName發(fā)生變化時,都會進(jìn)入這個函數(shù)
console.log(`我叫${value}`)
}
)
setTimeout(() => {
name.value = '前端有的玩'
otherName.firstName = '李'
}, 3000)
}
}復(fù)制代碼watch除了可以監(jiān)聽單個值或者函數(shù)返回值之外,也可以同時監(jiān)聽多個數(shù)據(jù)源,比如下面代碼所示:
export default {
setup() { const name = ref('子君') const gzh = ref('前端有的玩')
watch([name, gzh], ([name, gzh], [prevName, prevGzh]) => { console.log(prevName, name) console.log(prevGzh, gzh)
})
setTimeout(() => {
name.value = '前端有的玩'
gzh.value = '關(guān)注我,一起玩前端'
}, 3000)
}
}復(fù)制代碼watchEffect的用法與watch有所不同,watchEffect會傳入一個函數(shù),然后立即執(zhí)行這個函數(shù),對于函數(shù)里面的響應(yīng)式依賴會進(jìn)行監(jiān)聽,然后當(dāng)依賴發(fā)生變化時,會重新調(diào)用傳入的函數(shù),如下代碼所示:
import { ref, watchEffect } from 'vue'export default {
setup() { const id = ref('0')
watchEffect(() => { // 先輸出 0 然后兩秒后輸出 1
console.log(id.value)
})
setTimeout(() => {
id.value = '1'
}, 2000)
}
}復(fù)制代碼停止執(zhí)行
Vue2.0中的$watch會在調(diào)用的時候返回一個函數(shù),執(zhí)行這個函數(shù)可以停止watch,如下代碼所示
const unwatch = this.$watch('name',() => {})// 兩秒后停止監(jiān)聽setTimeout(()=> {
unwatch()
}, 2000)復(fù)制代碼在Vue3.0中,watch與watchEffect同樣也會返回一個unwatch函數(shù),用于取消執(zhí)行,比如下面代碼所示
export default {
setup() { const id = ref('0') const unwatch = watchEffect(() => { // 僅僅輸出0
console.log(id.value)
})
setTimeout(() => {
id.value = '1'
}, 2000) // 1秒后取消watch,所以上面的代碼只會輸出0
setTimeout(() => {
unwatch()
}, 1000)
}
}復(fù)制代碼清除副作用
想象一下這樣的一個場景,界面上面有兩個下拉框,第二個下拉框的數(shù)據(jù)是根據(jù)第一個下拉框的數(shù)據(jù)聯(lián)動的,當(dāng)?shù)谝粋€下拉框數(shù)據(jù)發(fā)生變化后,第二個下拉框的數(shù)據(jù)會通過發(fā)送一個網(wǎng)絡(luò)請求進(jìn)行獲取。這時候我們可以通過watchEffect來實現(xiàn)這個功能,比如像下面代碼這樣
import { ref, watchEffect } from 'vue'function loadData(id) { return new Promise(resolve => {
setTimeout(() => {
resolve( new Array(10).fill(0).map(() => { return id.value + Math.random()
})
)
}, 2000)
})
}export default {
setup() { // 下拉框1 選中的數(shù)據(jù)
const select1Id = ref(0) // 下拉框2的數(shù)據(jù)
const select2List = ref([])
watchEffect(() => { // 模擬請求
loadData(select1Id).then(data => {
select2List.value = data console.log(data)
})
})
// 模擬數(shù)據(jù)發(fā)生變化
setInterval(() => {
select1Id.value = 1
}, 3000)
}
}復(fù)制代碼現(xiàn)在假如我切換了一下第一個下拉框的數(shù)據(jù)之后,這時候數(shù)據(jù)請求已經(jīng)發(fā)出,然后我將這個頁面切換到另一個頁面,因為請求已經(jīng)發(fā)出,所以我希望在頁面離開的時候,可以結(jié)束這個請求,防止數(shù)據(jù)返回后出現(xiàn)異常,這時候就可以使用watchEffect為第一個回調(diào)函數(shù)傳入的入?yún)硖幚磉@個情況,如下代碼所示
function loadData(id, cb) { return new Promise(resolve => { const timer = setTimeout(() => {
resolve( new Array(10).fill(0).map(() => { return id.value + Math.random()
})
)
}, 2000)
cb(() => {
clearTimeout(timer)
})
})
}export default {
setup() { // 下拉框1 選中的數(shù)據(jù)
const select1Id = ref(0) // 下拉框2的數(shù)據(jù)
const select2List = ref([])
watchEffect(onInvalidate => { // 模擬請求
let cancel = undefined
// 第一個參數(shù)是一個回調(diào)函數(shù),用于模擬取消請求,關(guān)于取消請求,可以了解axios的CancelToken
loadData(select1Id, cb => {
cancel = cb
}).then(data => {
select2List.value = data console.log(data)
})
onInvalidate(() => {
cancel && cancel()
})
})
}
}復(fù)制代碼Vue3.0中使用計算屬性想一想在Vue2.0中我們一般會用計算屬性做什么操作呢?我想最常見的就是當(dāng)模板中有一個復(fù)雜計算的時候,可以先使用計算屬性進(jìn)行計算,然后再在模板中使用,實際上,Vue3.0中的計算屬性的作用和Vue2.0的作用基本是一樣的。
在Vue2.0中使用計算屬性
computed: {
getName() { const { firstName, lastName } = this.info return firstName + lastName
}
},復(fù)制代碼在Vue3.0中使用計算屬性
<template> <p class="about">
<h2>{{ name }}</h2>
</p></template>
<script>
import { computed, reactive } from 'vue'
export default {
setup() {
const info = reactive({
firstName: '王',
lastName: '二狗'
})
const name = computed(() => info.firstName + info.lastName)
return {
name
}
}
}
</script>復(fù)制代碼和Vue2.0一樣,Vue3.0的計算屬性也可以設(shè)置getter和setter,比如上面代碼中的計算屬性,只設(shè)置了getter,即加入cumputed傳入的參數(shù)是一個函數(shù),那么這個就是getter,假如要設(shè)置setter,需要像下面這樣去寫
export default {
setup() { const info = reactive({ firstName: '王', lastName: '二狗'
}) const name = computed({ get: () => info.firstName + '-' + info.lastName,
set(val) { const names = val.split('-')
info.firstName = names[0]
info.lastName = names[1]
}
}) return {
name
}
}
}復(fù)制代碼Vue3.0中使用vue-routervue-router在Vue2.0中我們使用vue-router的時候,會通過new VueRouter的方式去實現(xiàn)一個VueRouter實例,就像下面代碼這樣
import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter)const router = new VueRouter({ mode: 'history', routes: []
})export default router復(fù)制代碼但到了Vue3.0,我們創(chuàng)建VueRouter的實例發(fā)生了一點點變化,就像Vue3.0在main.js中初始化Vue實例需要像下面寫法一樣
import { createApp } from 'vue'createApp(App).$mount('#app')復(fù)制代碼vue-router也修改為了這種函數(shù)的聲明方式
import { createRouter, createWebHashHistory } from 'vue-router'const router = createRouter({ // vue-router有hash和history兩種路由模式,可以通過createWebHashHistory和createWebHistory來指定
history: createWebHashHistory(),
routes
})
router.beforeEach(() => {
})
router.afterEach(() => {
})export default router復(fù)制代碼然后在main.js中,通過
createApp(App).use(router)復(fù)制代碼
來引用到Vue中
setup中使用vue-router在Vue2.0中,我們通過this.$route可以獲取到當(dāng)前的路由,然后通過this.$router來獲取到路由實例來進(jìn)行路由跳轉(zhuǎn),但是在setup中,我們是無法拿到this的,這也意味著我們不能像Vue2.0那樣去使用vue-router, 此時就需要像下面這樣去使用
import { useRoute, useRouter } from 'vue-router'export default {
setup() { // 獲取當(dāng)前路由
const route = useRoute() // 獲取路由實例
const router = useRouter() // 當(dāng)當(dāng)前路由發(fā)生變化時,調(diào)用回調(diào)函數(shù)
watch(() => route, () => { // 回調(diào)函數(shù)
}, { immediate: true, deep: true
})
// 路由跳轉(zhuǎn)
function getHome() {
router.push({ path: '/home'
})
}
return {
getHome()
}
}
}復(fù)制代碼上面代碼我們使用watch來監(jiān)聽路由是否發(fā)生變化,除了watch之外,我們也可以使用vue-router提供的生命周期函數(shù)
import { onBeforeRouteUpdate, useRoute } from 'vue-router'export default {
setup() {
onBeforeRouteUpdate(() => { // 當(dāng)當(dāng)前路由發(fā)生變化時,調(diào)用回調(diào)函數(shù)
})
}
}復(fù)制代碼除了onBeforeRouteUpdate之外,vue-router在路由離開的時候也提供了一個生命周期鉤子函數(shù)
onBeforeRouteLeave(() => { console.log('當(dāng)當(dāng)前頁面路由離開的時候調(diào)用')
})復(fù)制代碼Vue3.0中使用vuex其實vuex在Vue3.0中的使用方式和vue-router基本是一致的
vuex首先新建store/index.js,然后添加如下代碼
import { createStore } from 'vuex'export default createStore({ state: {}, mutations: {}, actions: {}
})復(fù)制代碼然后在main.js中,通過以下方式使用
createApp(App).use(store)復(fù)制代碼
setup中使用vuex和useRouter一樣,vuex也提供了useStore供調(diào)用時使用,比如下面這段代碼
import { useStore } from 'vuex'export default {
setup() {
const store = useStore()
const roleMenus = store.getters['roleMenus']
return {
roleMenus
}
}
}復(fù)制代碼其余的使用方式基本和Vue2.0中的用法是一致的,大家具體可以參考vuex官方文檔
在前文中,我們說到Vue3.0是兼容一部分Vue2.0的,所以對于Vue2.0的組件寫法,生命周期鉤子函數(shù)并未發(fā)生變化,但是假如你使用的是componsition api,那么就需要做一部分調(diào)整
取消beforeCreate與created
在使用componsition api的時候,其實setup就代替了beforeCreate與created,因為setup就是組件的實際入口函數(shù)。
beforeDestroy與destroyed 改名了
在setup中,beforeDestroy更名為onBeforeUnmount,destroyed更名為onUnmounted
將生命周期函數(shù)名稱變?yōu)?code>on+XXX,比如mounted變成了onMounted,updated變成了onUpdated
在setup中使用生命周期函數(shù)的方式
setup() {
onMounted(() => { console.log('mounted!')
})
onUpdated(() => { console.log('updated!')
})
onUnmounted(() => { console.log('unmounted!')
})
}復(fù)制代碼實際用法與Vue2.0基本是一致的,只是寫法發(fā)生了變化,所以學(xué)習(xí)成本是很低的。
以上是關(guān)于Vue3.0的知識點分析的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁名稱:關(guān)于Vue3.0的知識點分析
瀏覽地址:http://www.chinadenli.net/article10/peeego.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站策劃、關(guān)鍵詞優(yōu)化、搜索引擎優(yōu)化、App設(shè)計、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)