您好,登錄后才能下訂單哦!
這篇文章主要介紹了vue在自定義組件上如何使用v-model和.sync的方法的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇vue在自定義組件上如何使用v-model和.sync的方法文章都會有所收獲,下面我們一起來看看吧。
tips
推薦始終使用 kebab-case 的事件名。(v-on會將事件名自動轉換為小寫,避免匹配不到)
changeData ×
change-data √
用法:
父組件定義數據源(不需要定義修改數據的方法),在子組件標簽上通過v-model="data"
進行傳遞
默認傳遞的屬性名是value
,事件名為input
。可以在子組件中配置model
選項重命名屬性名和事件名
子組件props接受名稱為value的屬性(固定名),通過$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>
為什么會有這個修飾符?它解決了什么問題?
正常我們父子組件通信是父組件props傳參,v-on監聽改變數據的事件,子組件通過$emit去觸發。
父組件每次都要定義類似的事件函數this.data = newData,如果是一個對象,那么它的每個屬性傳遞過去都要定義相應的事件函數(麻煩重復的代碼變多了)
.sync就是用來簡化這塊的代碼
怎么使用.sync?
父組件直接在子組件標簽上使用 :name.sync="person.name"
默認發送的處理的事件名為 update:name
,name就是你傳過去的屬性名
如果需要使用屬性,子組件可以通過props接收,也可以使用$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>
關于“vue在自定義組件上如何使用v-model和.sync的方法”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“vue在自定義組件上如何使用v-model和.sync的方法”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。