官方的介绍讲得比较全,这里就省去复制粘贴的步骤了。此处模拟一种非表单元素的 v-model 组件:

类似复选框,在组件里点选不同的选项,然后能跟父组件双向绑定。

1. 首先做好基础的排版及样式

<template><div style="padding:10px"><span>1</span><span>2</span><span>3</span><span>4</span></div>
</template><style scoped>span{display: inline-block;width: 80px;height: 30px;line-height: 30px;border-radius: 4px;border: 1px solid #333;color: #333;text-align: center;}span.active{border-color: #f45619;color: #f45619;}
</style>

2. 添加 model 属性

根据文档内容,v-model 需要两个属性:value、event,一个用来传值(父传子),一个用来接收并赋值(子传父)。

<inputv-bind:value="searchText"v-on:input="searchText = $event.target.value"
>

我们定为 val、change 以示区分

<script>export default {model:{prop:'val',event:'change'},// val 这个值本身是不存在的,所以需要通过 props 定义
  props:{val: Array,},};
</script>

3. 接下来,我们把数据进一步处理,通过 computed 计算属性操作父组件传过来的值。val 为 0,1,2,3 中的值组成的数组,如:[ 1,3 ]。通过 computed 转换为 list : [ 0,1,0,1]

<template><div style="padding:10px"><span :class="{'active':list[0]}" >1</span><span :class="{'active':list[1]}" >2</span><span :class="{'active':list[2]}" >3</span><span :class="{'active':list[3]}" >4</span></div>
</template><script>export default {model:{prop:'val',event:'change'},// val 这个值本身是不存在的,所以需要通过 props 定义
  props:{val: Array,},computed:{list(){let arr = []this.val.forEach(i=>{let n = parseInt(i)arr[n] = 1})return arr}},
};
</script><style scoped>span{display: inline-block;width: 80px;height: 30px;line-height: 30px;border-radius: 4px;border: 1px solid #333;color: #333;text-align: center;}span.active{border-color: #f45619;color: #f45619;}
</style>

4. 到这里实现了单向的绑定,然后根据子组件的事件操作给父组件传值。通过子组件的点击事件触发父组件的事件提交,并把新值带给父组件

<template><div style="padding:10px"><span :class="{'active':list[0]}" @click="onTap(0)">1</span><span :class="{'active':list[1]}" @click="onTap(1)">2</span><span :class="{'active':list[2]}" @click="onTap(2)">3</span><span :class="{'active':list[3]}" @click="onTap(3)">4</span></div>
</template><script>export default {model:{prop:'val',event:'change'},// val 这个值本身是不存在的,所以需要通过 props 定义
  props:{val: Array,},computed:{list(){let arr = []this.val.forEach(i=>{let n = parseInt(i)arr[n] = 1})return arr}},methods:{onTap(n){console.log(n)let list = this.listlist[n] = !list[n]let res = []list.map((i, idx)=>{if(i) res.push(idx)})// 注意// 此处的 change ,来自一开始定义在 model 属性里的event    // 父组件在接收到传过来的新值后,会用这个新值更新 val 属性,这样就会更新了自组件的值,完成双向绑定的过程      this.$emit('change',res)    } }
};
</script><style scoped>span{display: inline-block;width: 80px;height: 30px;line-height: 30px;border-radius: 4px;border: 1px solid #333;color: #333;text-align: center;}span.active{border-color: #f45619;color: #f45619;}
</style>

5. 父组件引用:

// 父组件
<template><div class="hello"><hello v-model="value"></hello></div>
</template><script>
import hello from '@/components/model'
export default {components:{ hello },data () {return {value:[1,3],}},
}
</script>

参考官方文档 :

在组件上使用 v-model 、 自定义组件的 v-model

转载于:https://www.cnblogs.com/_error/p/10345275.html

vue 自定义组件 v-model相关推荐

  1. vue 自定义组件双向数据绑定

    文章目录 序 属性&事件传值双向绑定 v-model组件双向绑定 .sync修饰符双向绑定 总结 !!!这边文章记录的是 vue2 的概念,vue3 对双向绑定进行了改动,不要把一下代码放到 ...

  2. vue自定义组件-文件上传后端接口

    学习目标: vue自定义组件-文件上传后端接口 学习内容: 准备工作: 后端环境:JAVA-Springboot项目数据库表(这里使用psql数据库):sys_file_record保存上传文件的信息 ...

  3. vue自定义组件及定义插槽

    vue自定义组件绑定事件: <!DOCTYPE html> <html lang="en"> <head><meta charset=&q ...

  4. vue自定义组件,插槽,自定义事件

    vue组件套娃 1. vue自定义组件 2. 组件和插槽套娃 3. vue组件通过自定义事件更改vue实例中的数据 1. vue自定义组件 语法 Vue.component('自定义组件名', {pr ...

  5. vue 嵌套表格组件_使用form-create动态生成vue自定义组件和嵌套表单组件

    使用form-create动态生成vue自定义组件和嵌套表单组件 maker.create 通过建立一个虚拟 DOM的方式生成自定义组件 生成 Maker let rule = [ formCreat ...

  6. vue自定义组件是.vue还是html,Vue自定义组件的四种方式示例详解

    四种组件定义方式都存在以下共性(血泪史) 规则: 1.组件只能有一个根标签 2.记住两个词全局和局部 3.组件名称命名中'-小写字母'相当于大写英文字母(hello-com 相当于 helloCom) ...

  7. Vue自定义组件封装及使用Excel

    Vue自定义组件封装及使用Excel 一.js-xlsx 组件安装 二. 创建vue组件 三.使用 四.效果图 一.js-xlsx 组件安装 npm install xlsx --savenpm in ...

  8. Vue自定义组件之时间跨度选择器

    时间跨度选择器 该组件是个时间跨度选择器. 基于 vue自定义组件之选择器 和 Vue自定义组件之日期时间范围选择器 点击选框,下拉列表中有四个选项,点击自定义时间,后边会出现 日期时间范围选择 代码 ...

  9. Vue自定义组件npm上传私服,且从私服下载使用

    Vue自定义组件npm上传私服,yarn私服下载使用 安装镜像源管理工具nrm 发布自定义组件到公司私服 若未下载nrm源管理工具直接使用npm设置私服地址也可以 以下步骤都是基于npm命令 从私服下 ...

  10. Vue自定义组件及组件传值

    vue自定义组件: 1.在src中components中,新建文件,后缀名为.vue组件(首字母建议大写)例如:Weekly.vue 2.Weekly.vue: 3.在app.vue中引用组件: js ...

最新文章

  1. 某米浏览器黑名单文件破解
  2. Redhat9安装firefox详解
  3. 写csv文件_机器学习Python实践——数据导入(CSV)
  4. POJ2527(两多项式取余)
  5. 算法(二叉树-矩阵-堆排序)
  6. python实训名片管理程序_python3学生名片管理v2.0版
  7. JavaScript 基础知识 - DOM篇(二)
  8. 不使用软盘加载驱动安装系统的方法--使用nLite集成驱动
  9. 兵器类专业学c语言吗,第四轮学科评估C类学科如何?学姐:重点大学,热门专业放心读...
  10. 关于cad2010的激活
  11. Java写入文件换行
  12. heic怎么转换成jpg格式?
  13. What is a hardlink and how to create one?
  14. 一看就懂的保姆级教程:open vn设置 (亲测通过)
  15. 【12c】新特性:Oracle 12c In-Database Archiving 数据库内归档
  16. 《秘密全在小动作上》读书笔记
  17. Win10 NVIDIA Container占用CPU高的处理方法
  18. Latex 打勾 打叉
  19. 最新多线程图解韩顺平老师2021
  20. C/C++ 小型餐馆订餐管理系统

热门文章

  1. 高级GIT教程——Cherry-Pick vs Rebase vs Merge
  2. eureka常见错误
  3. html5与python哪个好_3个原因告诉你,为什么选择HTML5大前端?
  4. 关于el-form中的rules未生效问题的解决方法
  5. element ui el-dialog 居中,并且内容多的时候内部可以滚动
  6. flow.php 漏洞,Ecshop 3.0的flow.php文件SQL注射漏洞修复
  7. Android花屏分析,Unity游戏在手机上运行时的花屏现象
  8. oracle中的脱机与联机,使存储池中的设备联机和脱机
  9. mysql添加字典子项_如何使用executemany在MySQL中插入Python字典列表
  10. linux用usermod修改密码,Linux笔记(usermod命令,用户密码管理,mkpasswd)