1.前言
最近在vue 項目中有一個需求籽懦, 就是我需要根據(jù)不同的類型在頁面中放不同的組件崩哩, 組件需要跟當前頁面的數(shù)據(jù)進行雙向綁定档悠,如果都寫在同一個頁面 代碼會顯得比較多思喊,畢竟我當前頁面已經(jīng)7-800行代碼了 所以我需要把一些元素定義成組件 壁酬,封裝起來,所以就會遇到 數(shù)據(jù)的傳值綁定問題
在這里我就分享我的方法恨课,也許很多博客上有過厨喂!
2.父組件
首先我們來看看官方文檔 [https://cn.vuejs.org/v2/guide/components.html#sync-修飾符]
.sync 修飾符所提供的功能。當一個子組件改變了一個 prop 的值時庄呈,這個變化也會同步到父組件中所綁定
就是說我們可以直接在我們需要傳的prop后面加上 .sync
比如 我下面需要綁定 p_model,然后我在他后面加上.sync
<certificate-input
:p_model.sync='pname'>
</certificate-input>
他會擴展成:
<certificate-input :p_model="pname" @update:p_model="val => pname= val"></certificate-input>
父組件全部代碼:
<template>
<div>
<certificate-input
:p_model.sync='pname'
:xi_model.sync="xiname">
</certificate-input>
</div>
</template>
import CertificateInput from '../common/CertificateInput.vue'
export default {
name: 'fathor',
components: {
CertificateInput
},
data() {
return {
pname:"",
xiname:""
}
}
子組件
上面說了一大推父組件下面我們來看看子組件怎么寫 ?
因為我項目中使用vux 代碼就直接復(fù)制過來改了一下
<template>
<div>
<x-input
title="姓名"
v-model="name"
></x-input>
<x-input title="身份證號"
v-model="idCard"
placeholder="請輸入身份證號"
required>
</x-input>
</div>
</template>
<script type="text/javascript">
import { XInput} from 'vux'
export default{
name:'certificateInput',
props:["p_model","xi_model"],
components:{
XInput
},
data(){
return{
name:this.p_model,
idCard:this.xi_model
}
},
watch:{
p_model(val) {
this.address = val;
},
name(val){
//設(shè)置監(jiān)聽派阱,如果改變就更新 p_model
this.$emit('update:p_model', val)
},
xi_model(val){
this.certificate = val
},
idCard(val){
this.$emit('update:xi_model', val)
}
}
}
</script>
由上面可以看出 子組件主要代碼 就是監(jiān)聽他的改變 然后觸發(fā)父組件監(jiān)聽的事件
name(val){
//設(shè)置監(jiān)聽诬留,如果改變就更新 p_model
this.$emit('update:p_model', val)
}
好了 上面就是我的方法
感覺寫的好low
以后多多改善
后面的修改:
在上文中我試用了watch 去監(jiān)聽 其實這可以換種方式來操作
// 如:watch中的
p_model(val) {
this.address = val;
},
可以改成
computed: {
_model:{
get() {
return this.p_model
},
set(val) {
this.$emit("update:p_model",val)
}
}
}