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 相关文章推荐
js中的数组Array定义与sort方法使用示例
Aug 29 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
Dec 08 Javascript
js判断字符长度及中英文数字等
Mar 19 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
Mar 02 Javascript
JQuery radio(单选按钮)操作方法汇总
Apr 15 Javascript
微信小程序开发之toast等弹框提示使用教程
Jun 08 Javascript
Vue之Watcher源码解析(2)
Jul 19 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
Jul 18 Javascript
使用vuex存储用户信息到localStorage的实例
Nov 11 Javascript
Vue常用的全选/反选的示例代码
Feb 19 Javascript
js实现详情页放大镜效果
Oct 28 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
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
Vue全局分页组件的实现代码
2018/08/10 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
python中requests使用代理proxies方法介绍
2017/10/25 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
Python FFT合成波形的实例
2019/12/04 Python
python如何进行矩阵运算
2020/06/05 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
写给女生的道歉信
2014/01/08 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
校园标语大全
2014/06/19 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS