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 相关文章推荐
JAVASCRIPT keycode总结
Feb 04 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
学习Bootstrap滚动监听 附调用方法
Jul 02 Javascript
JS制作图形验证码实现代码
Oct 19 Javascript
微信小程序 获取javascript 里的数据
Aug 17 Javascript
jQuery plugin animsition使用小结
Sep 14 jQuery
原生javascript实现的全屏滚动功能示例
Sep 19 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
vue的三种图片引入方式代码实例
Nov 19 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 Javascript
在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中文件上传的安全问题
2006/10/09 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
承办会议欢迎词
2014/01/17 职场文书
产品质量承诺书
2014/03/27 职场文书
旅游安全协议书
2014/04/21 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
教师自查自纠材料
2014/10/14 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
总结高并发下Nginx性能如何优化
2021/11/01 Servers
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js