vue 2 实现自定义组件一到多个v-model双向数据绑定的方法

论 Vue 中如何实现多个值的双向绑定 阅读详情

前言

有时候我们需要对一个组件绑定自定义 v-model,以更方便地实现双向数据,例如自定义表单输入控件。

甚至有时候,我们想要实现绑定多个 “v-model”,也就是多个“双向绑定”,例如带表单输入的模块框,想同时控制模态框的显示状态与表单的输入状态。好在 vue 3 已经实现了多 v-model,那么在 vue 2 上我们可以如下实现。

单个“双向绑定”的实现

  1. 使用 model 实现

    其实 v-model 只是 value + change 的语法糖,监听输入并触发改变,因此只要实现 “监听” + “触发” 就可以自定义 v-model 啦。

    <!-- 父组件 -->
    <template>
    	<Child v-model="value" />
    </template>
    <script>
    export default {
      data() {
        return {
          value: ''
        }
      }
    }
    </script>
    
    <!-- 子组件 -->
    <template>
    	<input v-model="input" />
    </template>
    <script>
    export default {
      props: {
        value: String,
      },
      model: {
        prop: 'value',		// 指定 v-model 要绑定的参数叫什么名字,来自于 props 中定义的参数
        event: 'change',	// 指定要触发的事件名字,将被用于 $emit
      },
      computed: {
        input: {
          // 这里的计算属性使用了 getter、setter,可以简化代码
          // 可参见链接 https://cn.vuejs.org/v2/guide/computed.html#%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7%E7%9A%84-setter
          get() {
            return this.value;
          },
          set(val) {
            this.$emit('change', val);	// 触发
          }
        }
      }
    }
    </script>
    

    这样一来,就实现了自定义组件的 v-model 实现,重点在于子组件中 model 的声明和 emit 事件。

  2. 使用 .sync 实现

    除了上面 model 的方法,其实还可以通过 sync 来实现。同样也是处理“监听”和“触发”就行。

    在官方文档中有写,https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-修饰符

    用上面相似的例子,可以这样来实现:

    <!-- 父组件 -->
    <template>
    	<Child :value.sync="value" />
    </template>
    <script>
    export default {
      data() {
        return {
          value: ''
        }
      }
    }
    </script>
    
    <!-- 子组件 Child -->
    <template>
    	<input v-model="input" />
    </template>
    <script>
    export default {
      props: {
        value: String,
      },
      computed: {
        input: {
          get() {
            return this.value;
          },
          set(val) {
            this.$emit('update:value', val);	// 这里的事件名字一定是 'update:' + prop的名字
          }
        }
      }
    }
    </script>
    

    很显然,使用这种方法的代码量比第1种要少,因为不用写 model 属性。只是比起 v-model,v-bind:value.sync 的写法还是不那么“引人注目”

多个“双向绑定”的实现

在 vue 3 出来之前,我们知道在一个标签里面最多只能有一个 v-model。但这并不意味着一个组件只能一次双向数据绑定。

根据上面 .sync 的方法,我们可以举一反三,多几个 update:xxxx 就可以了。

  1. 分开绑定

    下面以一个带输入框的模态框为例子,需求是父组件能够打开模态框,子组件在输入确认后能够关闭模态框;子组件能够输入,确认后能够将值传给父组件。

    <!-- 父组件 -->
    <template>
      <!-- 定义了两个v-bind:xxx.sync来实现两个双向绑定 -->
      <ModalInput :value.sync="value" :show.sync="show" />
    </template>
    <script>
    export default {
      data() {
        return {
          value: '',
          show: false
        }
      }
    }
    </script>
    
    <!-- 子组件 ModalInput -->
    <template>
      <!-- 这里假设Modal是一个带“确认”按钮,点击触发confirm事件,并利用v-model来控制展示的模态框 -->
      <Modal v-model="showModal" @confirm="onConfirm">
        <input v-model="input">
      </Modal>
    </template>
    <script>
    export default {
      props: {
        value: String,
        show: Boolean,
      },
      data() {
        return {
          input: ''		// 在这个例子中,使用 data 来声明 input,
                      // 因为只有在点击了“确认”按钮后,才要把值传给父组件(而不是实时传)
        }
      },
      computed: {
        showModal: {
          get() {
            return this.show;
          },
          set(val) {
            this.$emit('update:show', val);
          }
        }
      },
      methods: {
        onConfirm() {
          this.$emit('update:value', this.input);
          this.showModal = false
        }
      }
    }
    </script>
    
  2. 合并绑定

    上面是绑定了两个独立变量的双向绑定,按照官方的文档,我们甚至还可以用 v-bind.sync 来绑定整个对象(的所有成员!)。下面假设一个表单组件,同时收集个人多个信息

    <!-- 父组件 -->
    <template>
      <UserInfoForm v-bind.sync="inputs" />
    </template>
    <script>
    export default {
      data() {
        return {
          inputs: {
            name: '',
            age: 0,
            addr: '',
            phone: ''
          }
        }
      }
    }
    </script>
    
    <!-- 子组件 UserInfoForm -->
    <template>
      <form>
        <input v-model="name">
        <input v-model.number="age">
        <input v-model="addr">
        <input v-model="phone">
      </form>
    </template>
    <script>
    // 与上面例子实现方式相似,这里省略代码若干行。。。
    // 其实就是声明入参 props 有哪些
    // 用 computed 来声明各个变量的 getter 和 setter
    // getter 返回传进来的 prop,setter 中触发 update:xxxx 事件
    </script>
    

参考链接

Vue3中v-model指令实现父子组件中表单输入双向数据绑定 Vue3中,使用defineModel()函数实现父子组件表单数据的双向绑定 阅读详情

相关推荐

vue如何使用v-model指令创建双向数据绑定?

【代码】vue如何使用v-model指令创建双向数据绑定?

alankuo的专栏 1004

vue2.0 v-model 在自定义组件上的使用教程

Vue 2.0 自定义组件上使用v-model

郝峰vip的博客 4930

Windows下高效部署llama.cpp:从环境配置到模型量化的完整指南

本文提供了一份详尽的Windows系统下部署llama.cpp的完整指南。内容涵盖从Python环境配置、使用CMake与MinGW编译工具链的搭建,到编译llama.cpp项目、获取并转换模型为GGUF格式,以及执行模型量化和基础推理测试的全过程。指南旨在帮助开发者在普通Windows电脑上,无需高端显卡,仅凭CPU即可高效运行大语言模型,并重点解决了部署过程中常见的环境与编译错误。

weixin_28841265的博客 880

Vue2——v-model 双向绑定的原理

vue 的双向绑定的底层实现,其实就是通过 Object.defineProperty 和 Object.defineProperties 方法实现的。

2201_75342929的博客 3019

基于STM32+OV7670的图像采集系统(基础篇:ov7670介绍)

一、简单认识 先来看一下外观: OV7670,图像传感器,体积小,工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输入整帧、子采样、取窗口等方式的各种分辨率8位影像数据。 其他介绍比较繁琐,这里就不一一赘述了,我们只需要知道它是通过SCCB总线控制的就行了。 带FIFO与不带FIFO 目前市场上购买的ov7670模块分为两种,一种是不带FIFO芯片、一种是带FIFO芯片的。 FIFO是什么:(First Input First Output)先入先出的意思,

m0_59113542的博客 4万+

【大模型应用开发-大模型知识】(二)大模型分类和常见大模型

目前包含 Claude 和 Claude-Instant 两种模型可供选择,其中 Claude Instant 的延迟更低,性能略差,价格比完全体的 Claude-v1 要便宜,两个模型的上下文窗口都是 9000 个token(约 5000 个单词,或 15 页)它的目标是“更安全”、“危害更小”的人工智能。Google 还开发了多种 PaLM 的改进版本。更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。

1万+

vue2源码解析---v-model双向数据绑定

vue2源码解析--v-model

wzy0507的博客 1799

【RBF预测】基于粒子群算法优化RBF神经网络实现数据回归预测含Matlab源码

1 简介 原油含水率预测对于确定油井水,油层位以及估计原油产量有着非常重要意义.BP神经网络是最近常用的原油含水率预测方法,然而,由于BP神经网络存在容易陷入局部极小值,收敛速度慢等问题,影响了其预测的实用性和准确性,对此,提出基于粒子群优化RBF神经网络(PSO-RBFNN)的原油含水率预测方法,粒子群优化算法用于RBF神经网络参数优化.在分析原油含水率预测的影响因素基础上,建立粒子群优化RBF神经网络的原油含水率预测模型.实验结果表明,在原油含水率预测中,基于粒子群优化RBF神经网络比BP神经网络有着

qq_59747472的博客 1232

Vue内置指令——v-model(双向数据绑定)

v-model 指令在表单控件元素上创建双向数据绑定。根据控件类型自动选取正确的方法来更新元素。负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 注意:v-model 会忽略所有表单元素的 value、checked、selected属性的初始值而总是将 Vue 实例的数据作为数据来源。应该通过 JavaScript 在组件的 data 选项中声明初始值。 运行结果: 修饰符...

沐小侠 3433

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1234

国科大学习资料--高级软件工程-复习题概念解释答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题概念解释答案 1. 敏捷开发方法与Scrum方法 a.敏捷是一种强调轻量的过程方法论,它强调拥抱变化而不是与之对抗,通过有效的沟通发挥群体的智慧。敏捷方法采用迭代/增量开发的过程模型。敏捷宣言是:个体和交互高于流程和工具;工作的软件高于详尽的文档;客户合作高于合同谈判;响应变化高于遵循计划。 虽然右边的也有价值,但是认为左边的更有价值。 b.Scrum(Schwaber和Beedle)是管理两个披萨规模(4-9人)的软件开发团队的方法,它高频率的短会

无名何许人的博客 1444

vue自定义组件实现v-model双向数据绑定

双向数据绑定:{{$props.value}}点击++

weixin_74261199的博客 4803

【ESP32接入国产大模型之豆包】

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之豆包。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘。

vor234的博客 1万+

Vue3 v-model:灵活的双向数据绑定

Vue3 中的 v-model 经历了一些改进,提供了更灵活的用法来实现双向数据绑定。除了原生的表单元素外,v-model 现在可以应用于任意组件,并允许我们自定义 prop 和事件名称。使用 Vue3 的 v-model,我们可以更加方便地实现组件之间的数据双向同步,减少了手动处理数据绑定的工作量。

wxid_mtnujb6ipc0322的博客 1万+

[AI] 嵌入模型选择:bge / text-embedding-3 / Jina Embeddings 对比与选型指南

摘要: 本文对比了BGE-M3、OpenAI和Jina三种主流嵌入模型在语言覆盖、性能、延迟、维度和成本等维度的差异。BGE-M3适合中文场景,本地部署成本低;OpenAI API多语能力强但依赖网络;Jina在多语表现突出但需关注商用许可。测试显示BGE-M3本地延迟3-6ms,OpenAI API延迟200-600ms。选型建议:隐私场景选BGE本地部署,多语低维护选OpenAI,高精度选Jina。部署时需注意批处理优化、向量库压缩和商用许可等问题,建议建立评测指标并监控关键指标。

每日出拳老爷子的博客 428

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

前端Vue篇之v-model 是如何实现的,语法糖实际是什么?v-model 可以被用在自定义组件上吗?如果可以,如何使用?

v-model 是Vue提供的指令,用于在表单元素和组件上实现双向数据绑定。它实际上是一个语法糖,可以简化对数据的读写操作。在原生HTML元素上,v-model相当于给元素绑定value属性和input事件。对于自定义组件,可以通过model选项来实现v-model的双向绑定,确保组件和父组件之间的数据同步。

星辰迷上大海的博客 3837

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Vue中从v-model,model,.sync到双向数据传递,再到双向数据绑定

前面的话 虽然v-model和.sync之间的区别,是非常明显的,但是通过这个去研究下去,就有点意思了。首先说明v-model是.sync的一种特殊情况,也就是当prop是value,vm.$emit('update:input'),这个时候就是传统意义上的v-model,也就是说v-model是model为prop等于value,event为input的特殊情况。 概念 双向数据传递 为...

爪哇犀牛 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Vue自定义组件的model属性例子

今天看vue的官方教程 **自定义事件** 中的 **自定义组件的 v-model**时,没看明白,然后百度了好些资料,终于弄明白了。 1、v-model语法糖 v-model 指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。 例如下面的例子就实现了变量value和输入值的双向绑定: <div i...

IT学霸 1万+

聊一聊 Vue 双向数据绑定 v-model

双向数据绑定 v-model

一切源于分享 1825

Vue3双向数据绑定v-model

v-model 是Vue框架的一种内置的API指令,用于处理双向数据绑定,本质是一种语法糖写法。双向数据绑定是指数据绑定在视图上,视图的改变会影响绑定的数据,而数据的改变又会影响视图的显示。因此常用于表单项,表单元素通过v-model绑定数据,数据变化会影响表单元素的数据显示,而表单内的输入数据又会影响绑定的数据。</script><template><input v-model="message" placeholder="输入内容" />

sniper_fandc的博客 2004

Vue自定义组件使用v-model指令

基本概念与作用v-model 指令自定义组件与v-model示例一:基本的自定义组件v-model实现示例二:使用v-model处理复杂组件示例三:使用自定义事件名称示例四:处理多个属性的双向绑定使用技巧与分析在Vue.js中,v-model指令提供了一种便捷的方式来实现表单控件与Vue实例之间的双向数据绑定。然而,v-model默认仅适用于原生的HTML表单控件,如和。对于自定义组件而言,我们需要手动实现与v-model。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 3007

Vue自定义组件:解密v-model,轻松实现双向数据绑定

v-modelv-model在Vue中,可以通过自定义组件来实现v-model指令的双向数据绑定。实现自定义组件的v-model功能可以按照以下步骤进行:在自定义组件中定义一个value属性:这个属性用于接收父组件传递给子组件的值,并在子组件内部进行使用。在自定义组件中触发input事件:当在子组件中修改了value属性的值时,通过触发input事件来通知父组件进行更新。在父组件中使用v-model指令:在父组件中使用自定义组件时,使用v-model。

前端梦工厂 1534

Vue3 组件 v-model

Vue3 组件 v-model 摘要(149字): Vue3.4+推荐使用defineModel宏实现组件双向绑定,简化了props+自定义事件的传统方式。defineModel支持参数命名(v-model:title)、类型校验(type)、必填校验(required)等特性。文章通过输入框组件示例展示了父子组件数据同步、原生DOM包装、底层实现机制等核心用法。需注意默认值可能导致父子数据不同步问题,建议用required替代。v-model参数化功能允许自定义绑定属性名,增强组件灵活性,适用于复杂表单场

qq_39055970的博客 1620

Vue 双向数据绑定、数据变化 v-model

不能够输入就是没有value值,没有value值就证明不能捕获用户的输入,连输入的值都不能捕获那怎么可能影响数据的变化呢?v-bind最大特点就是单向数据绑定,修改了data里面的值容器里面的值也会跟着改变,但是修改容器里面的值data里面的值是不会发生变化的。还有另外一个指令可以完成双向的绑定。之前通过v-bind来完成的数据绑定,属性值和表达式进行绑定,表达式的值发生变化了属性值也跟着发生变化。2.v-model:value可以简写为v-model,因为v-mode1默认收集的就是value值。

小楼一夜听春雨,深巷明朝卖杏花 4419

vue自定义组件实现v-model双向绑定

vue中父子组件通信,都是单项的,直接在子组件中修改prop传的值vue也会给出一个警告,接下来就用一个小列子一步一步实现了vue自定义的组件实现v-model双向绑定,父组件值变了子组件也会跟着变,子组件中传过来的值变了,父组件值也会跟着变化。如有错误的地方欢迎评论指出 父级组件 &amp;amp;lt;template&amp;amp;gt; &amp;amp;lt;div&amp;amp;gt; &amp;amp;lt;p&amp;amp;g

寻梦无痕 5万+

Vue 在组件上使用 v-model

Vue 在组件上使用 v-model v-model 双向数据绑定 简单理解: 相当于在input上动态绑定了value, 又在input绑定了input事件 在组件上使用 在组件上使用 v-model 会默认在组件上添加 默认自定义属性( value ) 默认自定义事件( input ) 小栗子: <template> <div> 这里是父组件<b...

bao 3233
上一篇: TS类型断言简化对象类型声明
Dobility
博客等级 码龄12年 11粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值