Vue v-model组件封装(类似弹窗组件)


Posted in Javascript onJanuary 08, 2020

v-model是vue的一个语法糖,限制在input和textarea等这些表单元素中,官网所给的例子也是仅限于表单组件

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

现在我们如果想把v-model用到除表单之外的自定义组件中,该怎么使用呢,其实官网所给的例子也比较清晰了,只是如果死脑筋的话,那就限制住了,没错说的就是我-.-.

<!--封装的类弹窗组件-->
<template>
  <div>
    <div v-show="value">这是v-model的弹窗组件</div>
  </div>
</template>
<script>
export default {
  props:{
    value:{
      type:Boolean,
      default:false
    }
  }
}
</script>
<!--父组件-->
<template>
  <div>
    <v-model v-model="value"></v-model>
    <button @click="value=true">点击显示</button>
    <button @click="value=false">点击消失</button>
  </div>
</template>
<script>
import VModel from "./Vmodel"
export default {
  components:{VModel},
  data:function(){
    return {
      value:true
    }
  }
}
</script>

其实这样父组件这边已经可以通过v-model对显示和消失进行控制了,但是封装组件的 value 这个属性名是不能修改的,必须叫 value ,叫 value1 就不可以了

props:{
    value1:{ //失效
      type:Boolean,
      default:false
    }
  }

原因,看源码

function transformModel (options, data: any) {
 const prop = (options.model && options.model.prop) || 'value' //子组件不存在options.model,默认给value
 const event = (options.model && options.model.event) || 'input'//event="input"
 ;(data.attrs || (data.attrs = {}))[prop] = data.model.value
 const on = data.on || (data.on = {})
 const existing = on[event] //undefined
 const callback = data.model.callback //f()
 if (isDef(existing)) { //false
  if (
   Array.isArray(existing)
    ? existing.indexOf(callback) === -1
    : existing !== callback
  ) {
   on[event] = [callback].concat(existing)
  }
 } else {
  on[event] = callback //把回调赋值给监听的函数
 }
}

so,我们就可以加上model属性,进行代码修改

<template>
  <div>
    <div v-show="value">这是v-model的弹窗组件</div>
    <div @click="cancelClick">组件内部调用</div>
  </div>
</template>
<script>
export default {
  props:{
    value:{
      type:Boolean,
      default:false
    },
    model:{
      prop:"value",
      event:'change'
    }
  },
  methods:{
    cancelClick:function(){
      //内部调用这个方法可以进行控制
      this.$emit("change",false)
    }
  }
}
</script>

当然我们也可以通过model属性,对value这个属性名进行修改,也是实现同样的效果

bool:{
    type:Boolean,
    default:false
  },
model:{
  prop:"bool",
  event:'change'
}

注意如果灭有加model属性的话,对props的value属性名修改的话,是没效果的,默认的v-model的event默认修改的还是value

const prop = (options.model && options.model.prop) || 'value' //子组件不存在options.model,默认给value
 const event = (options.model && options.model.event) || 'input'//event="input"

总结

以上所述是小编给大家介绍的Vue中的 v-model组件封装(类似弹窗组件),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery监听div内容的变化具体实现思路
Nov 04 Javascript
jQuery插件datalist实现很好看的input下拉列表
Jul 14 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
Dec 21 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
angularJs中$http获取后台数据的实例讲解
Aug 08 Javascript
原生JS实现自定义下拉单选选择框功能
Oct 12 Javascript
解决iview多表头动态更改列元素发生的错误的方法
Nov 02 Javascript
使用layer模态框给新页面传值的方法
Sep 27 Javascript
小程序input数据双向绑定实现方法
Oct 17 Javascript
这样回答继承可能面试官更满意
Dec 10 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
Aug 19 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 Javascript
jquery实现吸顶导航效果
Jan 08 #jQuery
JS实现网站吸顶条
Jan 08 #Javascript
js实现移动端吸顶效果
Jan 08 #Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 #Javascript
微信小程序实现吸顶效果
Jan 08 #Javascript
JS实现吸顶特效
Jan 08 #Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 #Javascript
You might like
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python中Continue语句的用法的举例详解
2015/05/14 Python
详谈python http长连接客户端
2017/06/12 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
大学生毕业求职的自我评价
2013/09/29 职场文书
简历上的自我评价
2014/02/03 职场文书
超市开店计划书
2014/04/26 职场文书
医院见习报告范文
2014/11/03 职场文书
国家助学金感谢信
2015/01/21 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA