淺析Vue3中通過v-model實現父子組件的雙向數據綁定及利用computed簡化父子組件雙向綁定
一、vue2 中 sync 修飾符的功能在 vue3 中如何呈現?
1、sync 修飾符回顧
1、vue 規(guī)則:props 是單向向下綁定的,子組件不能修改 props 接收過來的外部數據。
2、如果在子組件中修改 props ,Vue會向你發(fā)出一個警告。(無法通過修改子組件的props來更改父組件。)而若需要在子組件更新數據時通知父組件同步更新,需要結合 $emit 和 v-on 實現。
3、而sync修飾符的作用則是簡化事件聲明及監(jiān)聽的寫法。
如下例子,比較sync和正常修改數據通知外層的寫法:可以看到 sync 修飾符確實簡便了許多。
// 父組件
<template>
<div> 數量: {{num}}</div>
<!-- <ChildComponent :num="num" @increase="num = $event"/> -->
<ChildComponent :num.sync="num" />
</template>
//子組件
<template>
<div @click="addNum"> 接收數量: {{num}}</div>
</template>
<script>
export default {
props: ['num'],
// data() {
// return {
// childNum: this.num
// }
// },
methods: {
addNum() {
// this. childNum++
// this.$emit('increase', this. childNum)
this.$emit('update:num', this.num + 1)
}
}
}2、sync 的語法糖功能在vue3中如何編寫使用?
vue3 中,通過 v-model:propName 實現自定義組件間數據的雙向綁定。使用方法:
(1)父組件通過 “v-model:綁定的屬性名” 傳遞數據屬性,支持綁定多個屬性;
(2)子組件配置emits,通過 “update:屬性名” 的格式定義更新事件
二、如何通過v-model實現父子組件的雙向數據綁定
Vue3父子組件雙向數據綁定寫法做了些許改變,同時也支持多個數據雙向綁定
1、單個數據雙向綁定
// 父組件 // v-model 沒有指定參數名時,子組件默認參數名是modelValue <ChildComp v-model="search" />
需要注意的是:
(1)子組件也并不是直接拿 props 傳的變量直接用,而是需要聲明一個響應式變量 - 通過 ref(props.modelValue) 聲明基于 props 傳的變量值為初始化值的響應式數據。
(2)且如果父組件傳的是異步數據的話,還需要對其進行監(jiān)聽。
(3)當子組件數據改變時需要通過 emit('update:modelValue', e) 去修改父組件數據實現雙向綁定。
<template>
<div>
<input v-model="sea" @input="valChange(sea)" />
</div>
</template>
<script lang="ts">
import { defineComponent, ref, watch } from 'vue'
export default defineComponent({
name: 'ChildComp',
props: {
modelValue: { // 父組件 v-model 沒有指定參數名,則默認是 modelValue
type: String,
default: ''
}
},
setup (props, { emit }) {
// input初始化
const sea = ref(props.modelValue)
// 如果父組件傳過來的數據是異步獲取的,則需要進行監(jiān)聽
watch(() => props.modelValue, () => { sea.value = props.modelValue })
// 數據雙向綁定
function valChange (e: string) {
emit('update:modelValue', e)
}
return {
sea,
valChange
}
}
})
</script>2、多個數據雙向綁定 - 與單數據綁定差別不大
// 父組件 <ChildComp v-model="search" v-model:address="addr" />
// 子組件對應為
props: {
modelValue: { // 父組件 v-model 沒有指定參數名,則默認是 modelValue
type: String,
default: ''
},
address: { // 父組件 v-model 有指定參數名,則是指定參數名
type: String,
default: ''
}
},
// input初始化
const sea = ref(props.modelValue)
const add = ref(props.address)
// 如果父組件傳過來的數據是異步獲取的,需要進行監(jiān)聽
watch(() => props.modelValue, () => { sea.value = props.modelValue })
watch(() => props.address, () => { add.value = props.address })
// 數據雙向綁定
emit('update:modelValue', e)
emit('update:address', e)3、利用 computed 簡化父子組件雙向數據綁定
上面是通過 ref 聲明響應式數據,其實可以通過 computed 計算屬性的 get / set 去簡化操作。如下:
const props = defineProps({
modelValue: {
type: Boolean,
default: false
}
})
const emit = defineEmits(['update:modelValue'])
const show = computed({
get() {
return props.modelValue
},
set(v) {
emit('update:modelValue', v)
}
})到此這篇關于淺析Vue3中通過v-model實現父子組件的雙向數據綁定及利用computed簡化父子組件雙向綁定的文章就介紹到這了,更多相關Vue3父子組件雙向綁定內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
前端vue3中的ref與reactive用法及區(qū)別總結
這篇文章主要給大家介紹了關于前端vue3中的ref與reactive用法及區(qū)別的相關資料,關于ref及reactive的用法,還是要在開發(fā)中多多使用,遇到響應式失效問題,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08
element-ui table行點擊獲取行索引(index)并利用索引更換行順序
這篇文章主要介紹了element-ui table行點擊獲取行索引(index)并利用索引更換行順序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02

