Vue2

先看看下面这两个组件自己理解一下。

父组件

<template><div class="home"><h3>输入的实时内容:{{ myValue }}</h3><custom-model v-model="myValue"></custom-model></div>
</template>
<script>
import CustomModel from './CustomModel'
export default {name: 'Home',components: {CustomModel,},data () {return {myValue: ''}},
}
</script>

子组件

<template><!-- 自定义组件中使用v-mode指令 --><input type="search" @input="changeInput" data-myValue="">
</template><script>
export default {name: 'CustomModel',// 当我们使用model的默认值的时候value作prop,input作event时,可以省略不写model。model: {prop: 'myValue', // 默认是valueevent: 'myInput', // 默认是input},props: {// 接收string和number类型的值,// 注意不能是写成字符串["String","Number"],因为此时它们是构造器,是全局变量myValue: [String, Number],},methods: {changeInput ($event) {// 向上派发myInput事件,这样model监听myInput才有意义:当输入字符时触发input事件,// 进而派发触发自定义的myInput事件,然后model监听myInput,就实现了数据绑定this.$emit('myInput', $event.target.value)},}
}
</script>

我们都知道,一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件。

Vue.component('custom-input', {props: ['value'],template: `<inputv-bind:value="value"v-on:input="$emit('input', $event.target.value)">`
})
<custom-input v-model="searchInput"></custom-input>

但是像单选框、复选框等类型的输入控件可能会将 value 作为服务器提交时的内容,可以通过 mode 来指定其他属性

Vue.component('custom-checkbox', {model: {prop: 'checked',event: 'change'},props: {checked: Boolean},template: `<inputtype="checkbox"v-bind:checked="checked"v-on:change="$emit('change', $event.target.checked)">`
})
<custom-checkbox v-model="selectFramework"></custom-checkbox>

标题Vue3

v-model prop 和事件默认名称已更改:
prop属性:value 变为-> modelValue; event事件:input 变为-> update:modelValue;

在 3.x 中,自定义组件上的 v-model 相当于传递了 modelValue prop 属性并接收抛出的 update:modelValue 事件:

Vue.component('custom-input', {props: ['modelValue'],template: `<inputv-bind:value="modelValue"v-on:input="$emit('update:modelValue', $event.target.value)">`
})
<custom-input v-model="searchInput"></custom-input>

v-model参数新增
若需要更改 model 名称,而不是更改组件内的 model 选项,那么现在我们可以将一个参数传递给 model:

Vue.component('custom-checkbox', {props: {checked: Boolean},template: `<inputtype="checkbox"v-bind:checked="checked"v-on:change="$emit('update:checked', $event.target.checked)">`
})
<custom-checkbox v-model:checked="selectFramework"></custom-checkbox>

我们在上面的代码中可以看到 v-model 后面加上了冒号传递参数 :checked ,表示 v-model 绑定的是 checked 属性,在触发的事件通过 update:属性 指定,注意格式是固定的,必须 update: 加上属性名称。

sync修饰符删除

如果需要的话,父级可以监听该事件并更新本地 data property。例如:

<custom-checkbox :checked="selectFramework" @update:checked="selectFramework = $event"></custom-checkbox>

为了方便起见,我们可以使用 .sync 修饰符来缩写,如下所示:

<custom-checkbox :checked.sync="selectFramework"></custom-checkbox>

vue3 中 bind 的 .sync 修饰符和组件的 model 选项已移除,统统都要使用 v-model 作为代替;

<custom-checkbox v-model:checked="selectFramework"></custom-checkbox>

而且允许我们在自定义组件上使用多个 v-model。

<ChildComponent v-model:title="pageTitle" v-model:content="pageContent" /><!-- 简写: --><ChildComponent:title="pageTitle"@update:title="pageTitle = $event":content="pageContent"@update:content="pageContent = $event"
/>

之前是自定义组件上只能使用一个,现在改为可以使用多个了。

Vue2和Vue3如何在组件中使用V-model相关推荐

  1. vue2 在element-ui的rate组件中,使用iconfont的图标

    背景: 在收到的设计稿里看到这么一个内容:20个人形图标,通过图标数目展示男女比例. 当然,通过计算的方式,使用div一个一个的把图标循环显示出来也不是不可以.但我是一个懒人,如果是有组件可用,一定是 ...

  2. vue3使用element组件中的Image导致频闪

    ↓ 只需要把el-image标签换成原生img标签就可以了.

  3. vue2、vue3中自定义v-model的使用和区别

    在我们的日常开发中,时常需要写一些自定义组件,而其中可能就会使用到v-model,v-model是Vue中的一个指令,用来实现数据的双向绑定,实现数据.视图更新,v-model是一个语法糖,,我们可以 ...

  4. Vue2.和Vue3.生命周期的区别,对比。 详解生命周期中的每个钩子函数,setup,

    文章目录 #1.Vue2.的生命周期与Vue3.的生命周期对比图 #1.1白色背景图是Vue2.的生命周期,黑色背景图是Vue3.的生命周期. #2.Vue2.与Vue3.的生命周期函数的不同 #2. ...

  5. 持续不断更新中... 自己整理的一些前端知识点以及前端面试题,包括vue2,vue3,js,ts,css,微信小程序等

    Vue3自考题 1,如何使用vue3的组合式api 答: 在普通的前端项目工程中,在script标签中增加setup即可使用api 使用setup()钩子函数 2,computed 与各个watch之 ...

  6. 深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别

    因为 Diff 算法,计算的就是虚拟 DOM 的差异,所以先铺垫一点点虚拟 DOM,了解一下其结构,再来一层层揭开 Diff 算法的面纱,深入浅出,助你彻底弄懂 Diff 算法原理 认识虚拟 DOM ...

  7. Vue2与Vue3中Ref绑定元素

    Vue之Ref绑定元素获取实例 我们可以通过给元素绑定ref属性来获取这个元素的实例,来调用实例中的某种方法来实现某种功能 Vue2实现 <template><!-- 单个绑定 -- ...

  8. vue2和vue3中mixins的使用

    混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被"混合"进入该组件 ...

  9. 在vue2、vue3中基于Three.js使用多张全方位照片拼接全景vr效果

    在vue2.vue3中基于Three.js使用多张全方位照片拼接全景vr效果 Vue3 代码如下(示例): <template><div class="Create&quo ...

最新文章

  1. 计算机二级基础知识教材,国家计算机二级考试公共基础知识教材
  2. python中json模块_Python的标准模块包json的实例用法
  3. 【雅礼集训2017】字符串【后缀自动机】【数据分治】
  4. Quartz作业调度框架及时间表达式的含义和语法
  5. Simple IOCP Server代码解读
  6. 工业和信息化部办公厅关于公布2021年产业技术基础公共服务平台复核结果的通知
  7. shiro中文api_Shiro
  8. dj鲜生-09-商品应用-首页的显示
  9. cilium插件测试_Cilium网络概述
  10. python源代码下载地址
  11. 中国数字化转型的未来与建议
  12. 电商系统(毕业设计)
  13. 大学生如何应聘高薪IT职位
  14. Win7去掉/恢复快捷方式箭头
  15. RESTful API及其设计思想
  16. 筷子兄弟--11度青春系列电影之老男孩,相信你会感动!!
  17. java 轨迹平滑算法_地图坐标轨迹平滑和纠偏
  18. [转]辨别常见与不常见音乐文件格式的质量好坏!
  19. 3G门户Android面试题(2013年)
  20. IE浏览器提示无法安全地连接到此页面,这可能是因为该站点使用过期的或不安全的 TLS 安全设置.该如何解决?

热门文章

  1. 前端 Leader 如何做好团队规划?阿里内部培训总结公开
  2. 关于短信验证码报错和解决问题
  3. Android实时模糊
  4. 从零开始的ASR(语音识别)之旅(附项目案例程序与环境配置过程)
  5. 移动联通基站使用介绍
  6. 微信头像下载并上传到阿里云OSS,PHP文件上传到阿里云OSS简单代码(OSS文件上传,微信头像下载,CURL下载文件,微信头像链接过期)
  7. 七个常出口国的最新关税要求
  8. 计算卫星高度角和方位角
  9. 前后分离,测试环境使用nginx调试解决跨域问题。
  10. 工业数据分析为什么要用FusionInsight MRS IoTDB?