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 动态参数判空操作
Dec 22 Javascript
php对mongodb的扩展(初识如故)
Nov 11 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
May 09 Javascript
基于Jquery实现焦点图淡出淡入效果
Nov 30 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
Mar 02 Javascript
Vue.2.0.5过渡效果使用技巧
Mar 16 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
Vue.js中的extend绑定节点并显示的方法
Jun 20 Javascript
基于JavaScript实现单例模式
Oct 30 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
Jul 28 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
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
为PHP初学者的8点有效建议
2010/11/20 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
PHP的拦截器实例分析
2014/11/03 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
jquery tools之tooltip
2009/07/25 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
python进阶教程之循环对象
2014/08/30 Python
Python使用Supervisor来管理进程的方法
2015/05/28 Python
python变量不能以数字打头详解
2016/07/06 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
python后端接收前端回传的文件方法
2019/01/02 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
保证金退回承诺函格式
2015/01/21 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
婚宴来宾致辞
2015/07/28 职场文书