前端框架Vue父子組件數據雙向綁定的實現
實現思路:
父 向 子 組件傳值:使用 props
屬性。( props
是property
[屬性] 的復數簡寫 )
子 向 父 組件傳值:使用自定義事件。
一、父子組件單向傳值
1、父向子傳值
父向子組件傳值,子組件接收到數據之後,保存到自己的變量中。
//父組件寫法 <cld :numP="num" ></cld> //子組件定義以及數據 components:{ cld:{ template:'#child', props:{ numP:Number }, } } //子組件內容 <template id="child"> <div> {{ numP }} </div> </template>
props 用於接收父組件傳過來的值,props 的寫法有很多種,具體如:
//方式1 : 直接接收數據 props: [ 'numP' ] //方式2: 加類型限制 props: [ numP: Number ] //方式3:添加默認值 props: [ numP: { type:Number, default:0 } ] //方式4:是否必須值限制 props: [ numP: { type:Number, default:0, require:true //添加必須值,不傳此值會報錯 } ] //方式5:采用對象形式 props: { numP: { type:Number, default:0, } }
2、子向父傳值
子向父組件傳值,主要通過自定義事件進行傳值,具體實例如下:
// 父組件內容 <div> 子組件獲取到的數據{{getNum}} <cld :numb="num" @accept="getNumC"></cld> </div> //父組件方法 methods:{ getNumC(data){ this.getNum = data //接收子組件傳的數據 } }, //子組件定義 components:{ cld:{ template:'#child', data(){ return{ numC:1314 //子組件數據定義 } }, mounted(){ this.$emit( 'accept' , this.numC ) // 觸發自定義事件 } } },
二、父子組件數據雙向綁定
Vue
的數據都是單向流動的,而且 vue
中從來就沒有任何的雙向綁定,v-model
實現的雙向綁定隻是語法糖而已。
方式1:利用 watch
實現父子組件的數據雙向綁定,具體實例如下:
<div id="app"> 數據<br>{{num}} <input type="text" v-model="num"><br> <cld :numb="num" @accept="getNumC"></cld> </div> //子組件內容 <template id="child"> <div> 數據<br>{{childNum}} <input type="text" v-model="childNum" /> </div> </template> <!-- 父子組件通信 --> const app = new Vue({ el:'#app', data:{ num:'520', }, methods:{ getNumC(data){ this.num = data } }, components:{ cld:{ template:'#child', props:{ numb:String }, data(){ return{ childNum:0, } }, watch:{ numb:function(){ this.childNum = this.numb }, childNum:function(){ this.$emit('accept',this.childNum) } }, mounted(){ this.childNum = this.numb } } } })
方式2:.sync
修飾符實現雙向綁定
在vue 1.x 中的 .sync 修飾符所提供的功能。當一個子組件改變瞭一個帶 .sync 的 prop 的值時,這個變化也會同步到父組件中所綁定的值。這很方便,但也會導致問題,因為它破壞瞭單向數據流。(數據自上而下流,事件自下而上走)
<cld :numb.sync="num" ></cld> //會擴展為: <cld :numb="bar" @update:numb=”val => bar = val”/>
當組件需要更新 numb 的值時,需要觸發更新事件:
this.$emit("update:numb", newValue );
使用具體實例如下:
// 父組件 <Father :foo.sync="foo"></Father> //子組件 props: ['foo'], data() { return { newFoo: this.foo; } }, methods:{ add:function(){ this.newMsg=10; this.$emit('update:foo',this.newFoo); } }
到此這篇關於前端框架Vue 父子組件數據雙向綁定的文章就介紹到這瞭,更多相關Vue 父子組件數據雙向綁定內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue在自定義組件上使用v-model和.sync的方法實例
- vue自定義組件如何通過v-model指令控制組件的隱藏、顯示
- vue修飾符v-model及.sync原理及區別詳解
- vue使用v-model進行跨組件綁定的基本實現方法
- vue實戰中的一些實用小魔法匯總