日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【说人话】真正意义上讲清楚了如何用$emit()在Vue.js的自定义组件中实现v-model=“”双向绑定

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【说人话】真正意义上讲清楚了如何用$emit()在Vue.js的自定义组件中实现v-model=“”双向绑定 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

子組件sg-component.vue代碼?

<template><div class="sg-component"><button @click="$emit('changeFontSizePx', ++fontSizePx)">增加+</button><button @click="$emit('changeFontSizePx', --fontSizePx)">減少-</button><button @click="$emit('changeFontSizePx', 12)">重置</button><p :style="{ 'font-size': fontSizePx + 'px' }"> 子組件字號:{{ fontSizePx }}px </p></div>
</template>
<script>
export default {props: ["fontSizePx"], //單項綁定(這個fontSizePx叫什么不重要,重要是保持一致,避開關鍵詞,用于接收父組件v-model=后面傳過來的值)model: {prop: "fontSizePx", //雙向綁定(這個fontSizePx叫什么不重要,重要是保持一致,避開關鍵詞,用于接收父組件v-model=后面傳過來的值)event: "changeFontSizePx",},
};
</script>

父組件(引用子組件)代碼

<template><div><sg-component v-model="fontSizePx" /><p :style="{ 'font-size': fontSizePx + 'px' }"> 父組件字號:{{ fontSizePx }}px </p></div>
</template>
<script>
import sgComponent from "@/vue/components/sg-component"; //引入舒工自定義組件
export default {components: { sgComponent },data() {return {fontSizePx: 12, //雙向綁定值};},
};
</script>

渲染效果

注意!在子組件內部不要用v-model綁定modelValue變量,否則會報錯Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "modelValue"?

具體原因參考官方文檔:https://cn.vuejs.org/v2/guide/components-props.html#單向數據流https://cn.vuejs.org/v2/guide/components-props.html#%E5%8D%95%E5%90%91%E6%95%B0%E6%8D%AE%E6%B5%81

那么如何解決這一“雙重雙向綁定”報錯問題呢?

我們可以在子組件內部引入一個中間變量(子組件內部作用域有效),用$emit()方法來觸發來同步更新子組件內部的中間變量變化值,這樣就可以有效避開“雙重雙向綁定”報錯問題了。

修改后的組件sg-component.vue代碼?

<template><div class="sg-component"><button @click="$emit('changeFontSizePx', ++in_fontSizePx)">增加+</button><button @click="$emit('changeFontSizePx', --in_fontSizePx)">減少-</button><button @click="$emit('changeFontSizePx', (in_fontSizePx = 12))"> 重置 </button><p :style="{ 'font-size': in_fontSizePx + 'px' }"> 子組件字號:{{ in_fontSizePx }}px </p></div>
</template>
<script>
export default {props: ["fontSizePx"], //單項綁定(這個fontSizePx叫什么不重要,重要是保持一致,避開關鍵詞,用于接收父組件v-model=后面傳過來的值)model: {prop: "fontSizePx", //雙向綁定(這個fontSizePx叫什么不重要,重要是保持一致,避開關鍵詞,用于接收父組件v-model=后面傳過來的值)event: "changeFontSizePx",},data() {return {//這里重新命名這個fontSizePx字段,不直接修改fontSizePx就可以解除報錯。in_fontSizePx: this.fontSizePx,};},
};
</script>

這樣就不會報錯了~!


擴展閱讀【進階玩法】Angular用emit()實現類似Vue.js的v-model雙向綁定[(ngModel)]功能_你摯愛的強哥?給你發來1條消息?-CSDN博客https://s-z-q.blog.csdn.net/article/details/120600781

總結

以上是生活随笔為你收集整理的【说人话】真正意义上讲清楚了如何用$emit()在Vue.js的自定义组件中实现v-model=“”双向绑定的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。