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 相关文章推荐
JavaScript 三种不同位置代码的写法
Oct 25 Javascript
js实现图片旋转的三种方法
Apr 10 Javascript
自己使用jquery写的一个无缝滚动的插件
Apr 30 Javascript
JavaScript设计模式之外观模式实例
Oct 10 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
判断颜色是否合法的正则表达式(详解)
May 03 Javascript
详解a++和++a的区别
Aug 30 Javascript
使用Vue写一个datepicker的示例
Jan 27 Javascript
微信小程序时间标签和时间范围的联动效果
Feb 15 Javascript
vue-loader中引入模板预处理器的实现
Sep 04 Javascript
leaflet加载geojson叠加显示功能代码
Feb 21 Javascript
JavaScript中展开运算符及应用的实例代码
Jan 14 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
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
Python中使用item()方法遍历字典的例子
2014/08/26 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
大学生个人求职信范文
2013/09/21 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
销售团队获奖感言
2014/08/14 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
2014年派出所工作总结
2014/11/21 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书