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 学习 几种常用方法
Jun 11 Javascript
THREE.JS入门教程(3)着色器-下
Jan 24 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
Aug 10 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
JavaScript 定时器详情
Nov 11 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入门源程序
2006/10/09 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
php批量删除操作代码分享
2017/02/26 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
使用PHP开发留言板功能
2019/11/19 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
js调试系列 初识控制台
2014/06/18 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
python 域名分析工具实现代码
2009/07/15 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Python 音频生成器的实现示例
2019/12/24 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
python如何将图片转换素描画
2020/09/08 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
董事长助理岗位职责
2014/02/18 职场文书
小学运动会口号
2014/06/07 职场文书
销售员岗位职责
2014/06/09 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
保险公司增员口号
2015/12/25 职场文书
Python保存并浏览用户的历史记录
2022/04/29 Python