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

本文主要是介绍vue3 双向绑定:如何在自定义组件中修改props定义的属性值,并更新父组件绑定的响应式变量值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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>

这篇关于vue3 双向绑定:如何在自定义组件中修改props定义的属性值,并更新父组件绑定的响应式变量值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964387

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali