computed set 自定义参数_深入理解vmodel之自定义组件用法

根据上一篇《深入理解 v-model 之表单用法》基本对 v-model 有了比较深的理解,接下来我们看看它如何在自定义组件中使用。

首先,我们知道下面两个用法等价的:

<input v-model="msg" />

<input :value="msg" @input="msg = $event.target.value" />

在 vue3 中

当在自定义组件中使用v-model时,组件接收一个属性modelValue的值,然后通过触发update:modelValue事件来更新该值:

<custom-comp v-model="msg">custom-comp>

<custom-comp :model-value="msg" @update:model-value="msg = $event">custom-comp>

v-model 实现

根据上面的定义规则,我们可以这样实现一个自定义 input 组件:

// 示例1:自定义input组件
// 实现1:
app.component('custom-input', {
  props: ['modelValue'],
  template: `      :value="modelValue"
      @input="$emit('update:modelValue', $event.target.value)"
    >
  `,
});
// 实现2:使用input的v-model + computed(计算属性)
app.component('custom-input', {
  props: ['modelValue'],
  computed: {
    value: {
      get() {
        return this.modelValue;
      },
      set(v) {
        this.$emit('update:modelValue', v);
      },
    },
  },
  template: `
  `,
});

使用:

<custom-input v-model="msg">custom-input>;

上面示例只是对 input 做了一层包装,如果自定义组件里面不包含 input 又该如何实现呢?为了加深理解,我们看下面一个自定义 count 组件示例:

// 示例2:自定义count组件
app.component('custom-count', {
  props: {
    modelValue: Number,
  },
  methods: {
    increment() {
      this.$emit('update:modelValue', ++this.modelValue);
    },
    decrement() {
      this.$emit('update:modelValue', --this.modelValue);
    },
  },
  template: `+1 ~ -1

{{modelValue}}


  `,
});

使用:

<custom-count v-model="num">custom-count>;

我们来看看实现

043e385728143c4b6d585a51514e3336.gif

vue3自定义组件的v-model实现

v-model 参数

通过示例我们发现 v-model 是接收属性modelValue的值,然后触发事件update:modelValue来更新该值,那么我们可不可以修改这个属性名modelValue呢?该如何操作?其实我们只需要给v-model添加参数即可,比如:v-model:mv,这样就将modelValue换成了mv

我们来将上面的自定义组件改造一下:

app.component('custom-input', {
  props: ['mv'],
  template: `      :value="mv"
      @input="$emit('update:mv', $event.target.value)"
    >
  `,
});

使用方式就变成了:

<custom-count v-model:mv="num">custom-count>;

多个 v-model 绑定

正是由于 vue3 中新增了 v-model 的参数传递,所以自定义组件可以同时支持多个v-model的绑定:

<user-name v-model:first-name="firstName" v-model:last-name="lastName">user-name>

组件实现就变成了:

app.component('user-name', {
  props: {
    firstName: String,
    lastName: String,
  },
  template: `      type="text"
      :value="firstName"
      @input="$emit('update:firstName', $event.target.value)">      type="text"
      :value="lastName"
      @input="$emit('update:lastName', $event.target.value)">
  `,
});

实现效果

ff1c53a11fe573adfbca3193e0dadfb5.gif

绑定多个v-model

在 vue2 中

当在自定义组件中使用v-model时,组件接收一个属性value的值,然后通过触发input事件来更新该值:

<custom-comp v-model="msg">custom-comp>

<custom-comp :value="msg" @input="msg = $event">custom-comp>

v-model 实现

实现方式类似,我们看下 vue2 中实现一个自定义 input 组件:

// 示例1:自定义input组件
Vue.component('comp-input', {
  props: {
    value: String,
  },
  template: `      type="text"
      :value="value"
      @input="$emit('input', $event.target.value)"
    >
  `,
});

自定义 v-model 属性

同样在 vue2 中也支持修改接收的属性名,只是和 vue3 不同,vue2 是通过在组件中指定属性 modelpropevent 来修改:

// 示例2:自定义count组件
Vue.component('custom-count', {
  model: {
    prop: 'v', // default: value
    event: 'i', // default: input
  },
  props: {
    v: Number,
  },
  data() {
    return {
      count: this.v,
    };
  },
  template: `+1`,
});

我们看到在这个示例里面多了一个model属性,并指定了两个属性:propevent,没错,这正是 v-model 需要的属性和事件名,只是他们的默认值为valueinput,我们通过修改 model 属性的 prop 和 event 就实现了自定义。

在线效果

b081d669f15e3236246a63a2634f38d6.gif

vue2自定义组件的v-model实现

关于为什么要出来一个 model 属性,官方文档也有说明,就是为了避免和 value 值有其他用途时和 v-model 产生冲突,比如单选框、复选框,具体可以查看官方示例

总结

自定义组件的 v-model 我们通过在 vue3 和 vue2 中的实现都讲解了一遍,而且也能发现了其中的差异:

  1. vue3 默认属性名、事件名为:modelValueupdate:modelValue;而 vue2 中则是:valueinput
  2. vue3 中直接通过 v-model 后面参数v-model:foo来指定属性名,而且修改体现在父组件中,并且支持绑定多个 v-model;而 vue2 中通过子组件的model 属性中的prop值和event值来指定属性名和事件名,修改体现在子组件中。

接下来我们来看下一篇:《深入理解 vue 中 v-model 之修饰符》。

文章引用链接:

  1. https://codepen.io/cleam_lee/pen/ExKMYKE
  2. https://codepen.io/cleam_lee/pen/MWyRpvg
  3. https://codepen.io/cleam_lee/pen/mdPvWvY
  4. https://cn.vuejs.org/v2/guide/components-custom-events.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84-v-model

b06fcf9c1a1c4ab73c778a59f44d4ae1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01json转字符串

/** * json转字符串声明 */ (NSString *)jsonToString:(NSDictionary *)dic; /** * json转字符串实现 */ (NSString *)jsonToString:(NSDictionary *)dic { if(!dic){ return nil; } NSData *jsonData [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWriting…

AYUSH的完整形式是什么?

AYUSH&#xff1a;阿育吠陀&#xff0c;瑜伽和自然疗法&#xff0c;乌纳尼&#xff0c;悉达多和顺势疗法 (AYUSH: Ayurvedic, Yoga and Naturopathy, Unani, Siddha and Homeopathy) AYUSH is an abbreviation of Ayurvedic, Yoga and Naturopathy, Unani, Siddha, and Homeopa…

大班科学电子计算机,计算器教案

计算器的认识和简单应用教学内容&#xff1a;义务教育六年制小学第九册第二单元第42页。教学目标&#xff1a;1、通过学生自主探究&#xff0c;掌握计算器的使用方法&#xff0c;并能够用计算器进行简单的计算。2、借助计算器解决生活中的数学问题、探索数学规律&#xff0c;体…

arraylist能否接收强转类型_ArrayList 源码解析

点击上方"IT牧场"&#xff0c;选择"设为星标"技术干货每日送达&#xff01;前言 JDK源码解析系列文章&#xff0c;都是基于JDK8分析的&#xff0c;虽然JDK14已经出来&#xff0c;但是JDK8我还不会&#xff0c;我…类图 实现了RandomAccess接口&#xff0c;…

exit c+_C / C ++中的exit(0)vs exit(1)与示例

exit cexit() is a library function in C/C programming language, it is used to terminate the calling process (function) immediately i.e. we can say it is used for the normal program termination and also perform the several cleanup steps. exit()是C / C 编程语…

校园计算机网络系统,校园计算机网络系统

一、校园网的基本概念基本功能&#xff1a;数据交换、资源共享&#xff0c;这里所指的数据包括各种信息&#xff0c;基本组成和结构&#xff1a;基本网络由网络网络的分类&#xff1a;有多种分类方法&#xff0c;按规模可分为局域网、区域网、&127;广域网。局域网服务范围一…

mc有什么红石机器人_我的世界10月考试!来测测你的MC成绩吧~

考试规则&#xff1a;本次考试为闭卷考试&#xff0c;考生需要在30分钟内完成试卷。试卷总分为100分&#xff0c;其中包括单项选择题50分&#xff0c;多项选择题20分&#xff0c;判断题30分。考试内容包括《我的世界》手游1.11.0及以上版本在不添加任何模组的情况下的所有游戏内…

130、 Android OkHttp完全解析(转载)

完全解析&#xff1a;http://blog.csdn.net/lmj623565791/article/details/47911083 从原理角度解析http文件上传 http://blog.csdn.net/lmj623565791/article/details/23781773 https://github.com/hongyangAndroid/okhttputils

json转string示例_C.示例中的String.Copy()方法

json转string示例C&#xff03;String.Copy()方法 (C# String.Copy() Method) String.Copy() method is used to copy a string to new string object, it returns a new instance of String with the same value as given string. String.Copy()方法用于将字符串复制到新的字符…

自定义分页 html,MVC 自定义HtmlHelper帮助类型之分页

方法一&#xff1a;在项目中增加App_Code文件夹&#xff0c;新增一个MyHtmlper.cshtml视图文件写入代码&#xff1a;helper Pagger(int pageIndex, int pageCount){for (int i 1; i < pageCount; i){if (i ! pageIndex){(i)}else{i}}}新增一个HomeControllerpublic class H…

vue 对象继承_Vue2.0中组件的继承与扩展是什么

Vue2.0中组件的继承与扩展是什么发布时间&#xff1a;2020-12-07 14:04:09来源&#xff1a;亿速云阅读&#xff1a;100作者&#xff1a;小新小编给大家分享一下Vue2.0中组件的继承与扩展是什么&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家参考一…

stack示例_C.示例中的Stack.Clone()方法

stack示例C&#xff03;Stack.Clone()方法 (C# Stack.Clone() method) Stack.Clone() method is used to create a shallow copy of the stack. Stack.Clone()方法用于创建堆栈的浅表副本。 Syntax: 句法&#xff1a; Object Stack.Clone();Parameters: None 参数&#xff1a…

简述计算机图形的图形应用主要有哪些,5计算机图形学考试简答题复习.doc

5计算机图形学考试简答题复习计算机图形学考试简答题复习1、简述计算机动画的概念&#xff0c;它经历了哪几个阶段的发展&#xff1f;(2分)计算机动画是指采用图形与图像的处理技术&#xff0c;借助于编程或动画制作软件生成一系列的景物画面&#xff0c;其中当前帧是前一帧的部…

在图片中选定任意凸多边形制作掩膜程序MATLAB

function S get_convex_S(C,vx,vy) %该函数实现的功能为指定图像中多边形的顶点&#xff0c;返回属于该凸多边形中的所有像素点 %xv&#xff0c;yv为顶点坐标按照顺时针或者逆时针。vx(1) xv(end); yv(1) yv(end) %输入的C是结构&#xff0c;vx vy是数组存的是顶点坐标。 %输…

js console 输出到文件_Node.js核心入门

正文核心模块是Node.js的心脏&#xff0c;主要是有一些精简高效的库组成(这方面和Python有很大的相似之处)&#xff0c;为Node.js提供了基础的API。主要内容包括&#xff1a;Node.js核心入门(一)全局对象常用工具事件机制Node.js核心入门(二)文件系统访问HTTP服务器与客户端全局…

scala 当前日期_如何在Scala中检查当前日期和时间?

scala 当前日期Scala is a general-purpose programming language, which is majorly used for data manipulation. It has libraries and support for almost all different utilities that are important. One of the important things that are required while programming …

计算机科学考试大纲,计算机科学与技术考试大纲.doc

计算机科学与技术考试大纲计算机科学与技术专业本专业的专业课程考试为“计算机软件基础”和“计算机硬件基础”两门课程的组合试卷&#xff0c;卷面总分200分&#xff0c;时间150分钟&#xff0c;考试方式为笔试。考试可携带计数器&#xff0c;但禁止携带文曲星、商务通等带有…

eclipse中项目内存溢出问题

2019独角兽企业重金招聘Python工程师标准>>> SpringBoot项目热启动Perm区内存溢出。 Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method jpaVendorAdapter threw exception; nested exception is java.lang.OutOfMemoryErro…

云盾idaas登陆_移动端扫码登录IDaaS平台

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":10,"count":10}]},"card":[{"des":"刷脸门禁通行系统前端接入人脸AI赋能的人脸…

express rest_Express / Node中用于REST API的邮递员工具

express restWhen dealing with routes (like in express), we may use any of the REST verbs and at times, the browser is limited to facilitate testing the routes/REST API. 在处理路由时(如快速表达)&#xff0c;我们可以使用任何REST动词&#xff0c;有时浏览器会受到…