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 相关文章推荐
JS创建自定义表格具体实现
Feb 11 Javascript
jquery查找父元素、子元素(个人经验总结)
Apr 09 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
jQuery动画与特效详解
Feb 01 Javascript
Jquery中CSS选择器用法分析
Feb 10 Javascript
JS+CSS相对定位实现的下拉菜单
Oct 06 Javascript
JS实现淡入淡出图片效果的方法分析
Dec 20 Javascript
JavaScript 异步调用
Oct 25 Javascript
vue中$refs的用法及作用详解
Apr 24 Javascript
微信小程序dom操作的替代思路实例分析
Dec 06 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
JS数据类型STRING使用实例解析
Dec 18 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
多数据表共用一个页的新闻发布
2006/10/09 PHP
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
几个javascript操作word的参考代码
2009/10/26 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
TensorFlow实现创建分类器
2018/02/06 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
wxpython绘制圆角窗体
2019/11/18 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
python里glob模块知识点总结
2021/01/05 Python
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
捐款倡议书格式范文
2014/05/14 职场文书
飞越疯人院观后感
2015/06/09 职场文书
离职证明格式样本
2015/06/12 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书