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,一经查实,立即删除!

相关文章

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…

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

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

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

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

自定义分页 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…

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

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

eclipse中项目内存溢出问题

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

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;有时浏览器会受到…

形象易懂讲解算法I——小波变换

https://zhuanlan.zhihu.com/p/22450818?referdong5 最早发于回答&#xff1a;能不能通俗的讲解下傅立叶分析和小波分析之间的关系&#xff1f; - 咚懂咚懂咚的回答现收入专栏。从傅里叶变换到小波变换&#xff0c;并不是一个完全抽象的东西&#xff0c;可以讲得很形象。小波变…

使用Linux命令行归档文件

存档文件 (Archiving Files) As we already understand what Compression (Compression techniques in Linux) is? We shall learn about Archives. We prefer compression as it is convenient to send file compressed through a network but sometimes it is not a smart w…

http缓存机制之304状态码

在网上看到一篇关于解释浏览器缓存更新机制304状态码的文章&#xff0c;里面说如果请求头中的If-Modified-Since字段和If-None-Match字段的值分别和响应头中的Last-Modified字段和Etag字段值一致&#xff0c;服务器就会返回304状态码(无响应体)&#xff0c;浏览器就从本地读取缓…

计算机选配 注意事项,选择鼠标注意事项有哪些

选择鼠标注意事项有哪些每台电脑旁边都有了一个忠实的伴侣&#xff0c;那就是“Mouse”--鼠标。选择鼠标最重要的一点就是质量&#xff0c;无论它的功能有多强大、外形多漂亮&#xff0c;如果质量不好那么一切都不用考虑了。那么&#xff0c;选择鼠标注意事项有哪些?笔记本鼠标…

js 验证护照_护照本地策略第2部分| Node.js

js 验证护照In my last article (Passport local strategy section 1 | Node.js), we started the implementation of the passport-local authentication strategy. We also looked at the various requirements to get started with the login form. In this article, we wil…

svn版利用什么技术实现_金葱粉涂料印花利用了什么技术?

金葱粉涂料印花利用了什么技术:金葱粉用涂料而不是用染料来生产印花布已经非常广泛&#xff0c;以致开始把它当作一种独立的印花方式。涂料印花是用涂料直接印花&#xff0c;该工艺通常叫做干法印花&#xff0c;以区别于湿法印花(或染料印花)。通过比较同一块织物上印花部位和未…

网站换服务器需要注意什么问题,网站更换服务器要注意哪些事项

原标题&#xff1a;网站更换服务器要注意哪些事项网站在运营的过程中&#xff0c;出于某种考虑&#xff0c;我们会将网站进行服务器的变更&#xff0c;那么在进行服务器变成过程中&#xff0c;需要注意哪些事项。一、如果是跨服务商更换网站服务器&#xff0c;需要做备案迁移。…

kafka分区与分组原理_大数据技术-Kafka入门

在大数据学习当中&#xff0c;主要的学习重点就是大数据技术框架&#xff0c;针对于大数据处理的不同环节&#xff0c;需要不同的技术框架来解决问题。以Kafka来说&#xff0c;主要就是针对于实时消息处理&#xff0c;在大数据平台当中的应用也很广泛。大数据学习一般都有哪些内…

ActiveReports 报表控件官方中文新手教程 (1)-安装、激活以及产品资源

&#xfeff;&#xfeff;本系列文章主要是面向初次接触 ActiveReports 产品的用户&#xff0c;能够帮助您在三天之内轻松的掌握ActiveReports控件的基本用法&#xff0c;包含安装、激活、创建报表、绑定数据源以及公布等内容。本篇文章我们就从安装产品開始带您开启轻松的 Ac…

如何在React Native中使用React JS Hooks?

In my articles, Im going to be using either expo or snack online IDE and android emulator. 在我的文章中&#xff0c;我将使用expo或点心在线IDE和android模拟器。 React Hooks is simply an awesome tool that helps us use states and other react features without w…

华为P40pro 手机云台_2020年目前拍照最好的手机推荐!华为P40 Pro!DXO全球榜首

目前最热门的拍照手机自然是华为P40 Pro&#xff0c;其相机性能直接问鼎DXOMARK手机相机评分榜首。对于拍照要极求高的用户&#xff0c;华为P40 Pro将是一个非常不错的选择。那么&#xff0c;华为P40 Pro除了出色的相机之外&#xff0c;其它方面表现如何呢&#xff1f;下面&…

Centos 7安装与配置nagios监控(一)

目 录序言(必备知识)一、安装规划1.1系统环境1.2所需软件包二、配置安装环境2.1同步时间2.2禁用SElinux2.3 xftp上传软件包2.4安装邮件服务三、监控主机安装3.1安装nagios的运行环境3.2增加用户3.3安装nagios3.4配置权限3.5安装插件3.6安装nrpe四、远程主机安装4.1配置运行环境…

备份linux系统报错_Linux 系统如何快速入门?分享民工哥总结的经验

大家好&#xff0c;我是民工哥。认识或熟悉我的人都知道&#xff0c;是做运维出身的&#xff0c;所以&#xff0c;很多时候&#xff0c;有很多朋友喜欢问我一些有关运维的问题&#xff0c;比如&#xff1a;我应该如何入门Linux系统运维&#xff1f;Linux系统运维到底需要学哪些…