詳解vue3中的非父子組件傳值
vue2中非父子組件的傳值主要是通過事件總線,創(chuàng)建一個(gè)vue實(shí)例,通過在不同的組件中導(dǎo)入該實(shí)例來實(shí)現(xiàn)非父子組件之間的通信行為。 vue3提供了**provide**和**inject**屬性,可以實(shí)現(xiàn)非父子組件之間的通信; 假設(shè)有三個(gè)組件:App.vue(父級(jí))、sub1(子級(jí))、sub2(子級(jí)的子級(jí)):
App.vue
<template> <div style="border: 1px solid pink"> <h1>我是你爹</h1> <span>??</span> <sub1/> </div> </template> <script> import sub1 from './sub1' export default { name: "App", components:{ sub1, }, provide:{ // 通過在父組件中定義provide 聲明要傳遞的值 names:['peanut','javascriptKing'] } } </script> <style scoped> </style>
sub1.vue
<template> <h2>我是一級(jí)子組件</h2> <span>??</span> <sub2/> </template> <script> import sub2 from "./sub2"; export default { name: "sub1", components:{ sub2, } } </script> <style scoped> </style>
sub2.vue
<template> <h3>我是最小的,也就是孫子</h3> <div>我引用了頂級(jí)組件的names數(shù)組 ===> {{names}}</div> </template> <script> export default { name: "sub2", // 通過inject 在子組件中接受某一個(gè)跨級(jí)傳遞的值 inject:['names'], } </script> <style scoped> </style>
實(shí)現(xiàn)效果如下,可以看到是可以正常獲取頂級(jí)組件中傳遞的值:
但是也會(huì)出現(xiàn)問題:
就是頂級(jí)組件要傳遞的值變化時(shí),如何讓它實(shí)現(xiàn)響應(yīng)式呢?
如何在provide屬性中通過this獲取當(dāng)前的實(shí)例呢?
這里就需要將provide屬性書寫為方法的形式,返回一個(gè)數(shù)組或者對(duì)象:
<template> <div style="border: 1px solid pink"> <h1>我是你爹</h1> <span>??</span> <sub1/> </div> </template> <script> import sub1 from './sub1' export default { name: "App", data(){ return { names:['peanut','javascriptKing'] } }, components:{ sub1, }, /*這樣寫是拿不到this的 此時(shí)的this只想script內(nèi)的作用域 this為undefined*/ /*provide:{ this.names, }*/ // 應(yīng)該這樣寫 provide(){ return { names:this.names } } } </script> <style scoped> </style>
像上面這樣寫,雖然可以拿到this指向的實(shí)例下的數(shù)據(jù),但是如何讓它們形成依賴關(guān)系,實(shí)現(xiàn)響應(yīng)式呢?對(duì)此我們需要對(duì)App.vue做如下的修改:
<template> <div style="border: 1px solid pink"> <h1>我是你爹</h1> <span>??</span> <sub1/> </div> </template> <script> import sub1 from './sub1' import { computed } from 'vue' export default { name: "App", data(){ return { names:['peanut','javascriptKing'] } }, components:{ sub1, }, /*這樣寫是拿不到this的 此時(shí)的this只想script內(nèi)的作用域 this為undefined*/ /*provide:{ this.names, }*/ // 應(yīng)該這樣寫 provide(){ return { names:computed(() =>{ this.names.length }) // 使用計(jì)算屬性返回該變量 使得names與data中的names形成依賴關(guān)系 } }, mounted() { setInterval(()=>{ this.names.push('vue大王!') },1000) } } </script> <style scoped> </style>
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vue3中獲取dom元素和操作實(shí)現(xiàn)方法
ref是Vue3中一個(gè)非常重要的功能,它可以用來獲取DOM節(jié)點(diǎn),從而實(shí)現(xiàn)對(duì)DOM節(jié)點(diǎn)的操作,下面這篇文章主要給大家介紹了關(guān)于vue3中獲取dom元素和操作實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-06-06解決運(yùn)行vue項(xiàng)目內(nèi)存溢出問題
這篇文章主要介紹了解決運(yùn)行vue項(xiàng)目內(nèi)存溢出問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04基于Vue3實(shí)現(xiàn)旋轉(zhuǎn)木馬動(dòng)畫效果
這篇文章主要為大家介紹了如何利用Vue3實(shí)現(xiàn)旋轉(zhuǎn)木馬的動(dòng)畫效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Vue有一定的幫助,需要的可以參考一下2022-05-05解決vue-cli3創(chuàng)建使用iview定制主題javascriptEnabled找不到該配置項(xiàng)
這篇文章主要介紹了解決vue-cli3創(chuàng)建使用iview定制主題javascriptEnabled找不到該配置項(xiàng)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Vue中使用localStorage存儲(chǔ)token并設(shè)置時(shí)效
這篇文章主要為大家介紹了Vue中使用localStorage存儲(chǔ)token并設(shè)置時(shí)效,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06解決vue2中使用elementUi打包報(bào)錯(cuò)的問題
這篇文章主要介紹了解決vue2中使用elementUi打包報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09vue實(shí)現(xiàn)菜單權(quán)限控制的示例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)菜單權(quán)限控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03