vue插件实现v-model功能


Posted in Javascript onSeptember 10, 2018

最近在开发自己的富文本编辑器插件,在开发中遇到了很多问题其中我觉得比较好的问题就是在你定义的插件中实现双向绑定。就好像input中v-model的功能类似。

v-model语法:

在vue中我们实现表单的双向绑定时代码一般时这样写的:

<input type="text" v-model="value" style="line-height: 30px;">
data () {
 return {
 value: '222'
 }
}

可以通过这样的方式实现value的值和输入框中的值双向绑定了。

事实上v-model只是一个语法糖,他的真正实现是这样的:

<input type="text" :value="value" @input="value=$event.target.value">

以上代码分几个步骤:

1.将输入框的值绑定到变量上,这个是单向绑定,意味着改变变量的值可以改变输入框的值,但是改变输入框的值不能改变变量的值

2.监听input事件(input输入框都有该事件,当输入内容时自动触发该事件),当输入框输入内容就单向改变变量的值了

自定义编辑器双向绑定

这个是插件的写法:content是双向绑定的值 height是指编辑器的高度

<editor v-model="content" :height="editorHeight"></editor>

插件vue的写法:

<div v-bind:style="{height: height}" class="editor-box" ref="editor" contenteditable v-html="contentHtml" @input="changeText"></div>

在div中设置contenteditable属性时把div设置成可编辑的输入框,v-html是给编辑器单向绑定变量contentHtml值,input方法获取编辑器的内容并且返回给父元素的input方法:

changeText () {
  const htmlString = this.$refs.editor.innerHTML
  this.$emit('input', htmlString)
 },

其他问题:

光是这样是不能够解决问题的,编辑器你会出现每次输入的时候都会跳到开头位置:怎么解决呢?不多说上代码:

props: {
 value: {
  type: String,
  default: ''
 },
 height: {
  type: String,
  default: 'auto'
 }
 },
data () {
 return {
  // 编辑器内容
  contentHtml: this.value || this.value === 0 ? this.value : '<div><br></div>',
  // 是否在编译
  isLocked: true,
  // 光标位置
  lastEditRange: null
 }
 },
 watch: {
 value (val) {
  if (!this.isLocked) {
  this.contentHtml = this.value;
  }
 }
 }

写到这里大家应该一头雾水这样写有什么用:因为还少了一些代码:

<div v-bind:style="{height: height}" class="editor-box" ref="editor" contenteditable v-html="contentHtml" @input="changeText" @focus="focusEditor" @blur="blurEditor"></div>
 // 编辑器失去焦点
 blurEditor (event) {
  this.isLocked = false
 },
 // 编辑器获得焦点
 focusEditor (event) {
  this.isLocked = true
 },

需要给插件添加两个方法判断编辑器是否正在编辑内容,如果正在编辑中父组件绑定的值不让他重新渲染子组件,这样编辑器中的内容就不会重新赋值了,这样光标就不会每次都跑到前面去了。

小小的总结一下:

•v-bind只能实现单向绑定
•v-model(v-bind+触发的input事件)实现双向绑定

总结

以上所述是小编给大家介绍的vue插件实现v-model功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery中SetTimeOut传参问题探讨
May 10 Javascript
js函数中onmousedown和onclick的区别和联系探讨
May 19 Javascript
javascript实现文字图片上下滚动的具体实例
Jun 28 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
May 16 Javascript
AngularJs点击状态值改变背景色的实例
Dec 18 Javascript
JS实现简单的星期格式转换功能示例
Jul 23 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
js prototype和__proto__的关系是什么
Aug 23 Javascript
构建Vue大型应用的10个最佳实践(小结)
Nov 07 Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
在Angular中使用JWT认证方法示例
Sep 10 #Javascript
详解vue-router传参的两种方式
Sep 10 #Javascript
详解Vue.js使用Swiper.js在iOS
Sep 10 #Javascript
webuploader分片上传的实现代码(前后端分离)
Sep 10 #Javascript
在Vue 中使用Typescript的示例代码
Sep 10 #Javascript
ES6使用export和import实现模块化的方法
Sep 10 #Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
Sep 10 #Javascript
You might like
推荐php模板技术[转]
2007/01/04 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python生成圆形图片的方法
2020/03/25 Python
python实现简单的文字识别
2018/11/27 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
详解python中递归函数
2019/04/16 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
初中生学习的自我评价
2013/11/14 职场文书
节约电力资源的建议书
2014/03/12 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
公司管理建议书
2015/09/14 职场文书
小学班长竞选稿
2015/11/20 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js