tips
自定義元件的v-model
v-model="data"
進行傳遞value
,事件名為input
。可以在子元件中設定model
選項重新命名屬性名和事件名$emit("input", payload)
在子元件即可修改資料,形成雙向繫結 // 父元件
<template>
<div>
<p>我是dad</p>
<span>{{ dadData }}</span>
<Son v-model="dadData" />
</div>
</template>
<script>
import Son from "./SonItem.vue";
export default {
components: {
Son,
},
data() {
return {
dadData: "我是爹地",
};
},
};
</script>
// 子元件
<template>
<div>
<p>我是兒子元件</p>
<input type="text" :value="value" @input="sonInput" />
<button @click="btnClick(Date.now())">點選</button>
</div>
</template>
<script>
export default {
// 如果重新命名,記得這裡也要修改哦 props: ["novalue]
props: ["value"],
// 這裡可以重新命名接收到的屬性值和事件名
// model: {
// prop: "novalue",
// event: "changeNoval",
// },
methods: {
sonInput(e) {
this.$emit(`input`, e.target.value);
},
btnClick(data) {
this.$emit(`input`, data);
},
},
};
</script>
.sync 修飾符
為什麼會有這個修飾符?它解決了什麼問題?
怎麼使用.sync?
:name.sync="person.name"
update:name
,name就是你傳過去的屬性名$attr,$parent
等獲取。注意:props接收過的屬性不會出現在當前範例的$attr中$emit("update:屬性名", payload)
,也可以使用$listener
v-bind.sync="obj"
可以把obj物件中的每個屬性和事件自動分發給子元件// 父元件
<template>
<div>
<p>我是dad</p>
<span>{{ dadData }}</span>
<Son :something.sync="dadData" v-bind.sync="dadObj" />
</div>
</template>
<script>
import Son from "./SonItem.vue";
export default {
components: {
Son,
},
data() {
return {
dadData: "我是爹地",
dadObj: {
girlFriends: ["dingding", "momo", "weiwei"],
age: 24,
},
};
},
};
</script>
// 子元件
<template>
<div>
<p>我是兒子元件</p>
<button @click="btnClick(Date.now())">點選</button>
<span>{{ something }}</span>
<span>{{ girlFriends }}</span>
</div>
</template>
<script>
export default {
props: ["something", "girlFriends"],
methods: {
btnClick(data) {
this.$emit(`update:something`, data);
},
},
mounted() {
this.$listeners["update:girlFriends"](["singleDog"]);
// {age: 24}
console.log(this.$attrs);
},
};
</script>
思考
v-model和.sync本質都是語法糖,設計出來就是為了方便使用減少程式碼量。不過更利於使用的封裝究竟是方便新手的上手還是加重了學習負擔,可能各執己見吧
https://cn.vuejs.org/v2/guide/components-custom-events.html