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 常用操作方法
Jan 28 Javascript
动态加载外部javascript文件的函数代码分享
Jul 28 Javascript
jQuery 常见小例汇总
Dec 14 Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
Sep 23 jQuery
微信小程序实现换肤功能
Mar 14 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 Javascript
vue组件中传值EventBus的使用及注意事项说明
Nov 16 Javascript
javascript遍历对象的五种方式实例代码
Oct 24 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中文字符串截取函数
2013/11/12 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
vue实现计步器功能
2019/11/01 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
浅谈Python中copy()方法的使用
2015/05/21 Python
Python Socket编程详细介绍
2017/03/23 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
编辑硕士自荐信范文
2013/11/27 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
镇班子对照检查材料思想汇报
2014/09/24 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS