首页 前端知识 vue3 双向绑定:如何在自定义组件中修改props定义的属性值,并更新父组件绑定的响应式变量值

vue3 双向绑定:如何在自定义组件中修改props定义的属性值,并更新父组件绑定的响应式变量值

2024-05-30 10:05:24 前端知识 前端哥 888 80 我要收藏

1、自定义支持双向绑定的prop

在子组件中声明一个 count prop,通过触发 update:count 事件更新父组件值

子组件示例代码:

<template>
<div>
<div>[子组件] count: {{ count }}</div>
<button @click="onClick">+1</button>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'child-component',
props: {
count: {
type: Number,
default: 0
}
},
emits: ['update:count'],
setup(props, ctx) {
const onClick = () => {
ctx.emit('update:count', props.count + 1);
}
return {
onClick
};
}
});
</script>
复制

 父组件示例代码:

<template>
<div>
<div>[父组件] count: {{ count }}</div>
<child-component :count="count" @update:count="count = $event"></child-component>
</div>
</template>
<script lang="ts">
import ChildComponent from '@/components/child-component/child-component.vue';
import { defineComponent, ref } from 'vue';
export default defineComponent({
components: { ChildComponent },
setup() {
return {
count: ref<number>(0)
};
}
});
</script>
复制

简化写法(语法糖),使用 v-model 双向数据绑定的指令

<child-component v-model:count="count"></child-component>
复制

2、子组件 prop 为  modelValue  

在子组件中声明一个  modelValue  prop,通过触发  update:modelValue  事件更新父组件值,父组件使用  v-model v-model:modelValue v-model:model-value  的写法都是支持的。

子组件示例代码:

<script setup lang="ts">
defineProps(['modelValue'])
</script>
<template>
<el-input :modelValue="modelValue" @input="$emit('update:modelValue', $event)"/>
</template>
复制

 父组件示例代码:

<script setup lang="ts">
import { ref } from 'vue'
import ChildComponent from './components/ChildComponent.vue'
const parentValue = ref('')
</script>
<template>
<ChildComponent v-model="parentValue" />
</template>
复制

 其他支持写法:

<ChildComponent v-model:modelValue="parentValue" />
<ChildComponent v-model:model-value="parentValue" />
<ChildComponent :modelValue="parentValue" @update:modelValue="parentValue = $event" />
<ChildComponent :model-value="parentValue" @update:model-value="parentValue = $event" />
复制

3、子组件中也存在组件 v-model 的值需与 prop 的值同步

定义一个可写的 computed 响应式变量,get直接返回传入子组件的 prop,set变更 prop 的值

<script setup lang="ts">
import { computed } from 'vue'
const props = defineProps(['modelValue'])
const emits = defineEmits(['update:modelValue'])
const childValue = computed({
get: () => props.modelValue,
set: (val) => emits('update:modelValue', val)
})
</script>
<template>
<el-input v-model="childValue"/>
</template>
复制

4、vue3.4+ 推荐使用 defineModel

写法更加简单,关于默认值、必填等选项配置可查阅文档

 官方文档:https://cn.vuejs.org/api/sfc-script-setup.html#definemodel

子组件示例代码:

<script setup lang="ts">
const modelValue = defineModel()
</script>
<template>
<el-input v-model="modelValue" />
</template>
复制

转载请注明出处或者链接地址:https://www.qianduange.cn//article/10048.html
评论
还可以输入200
共0条数据,当前/页
发布的文章

JQuery中的load()、$

2024-05-10 08:05:15

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!