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实现读取txt文档的脚本
Jul 20 Javascript
解javascript 混淆加密收藏
Jan 16 Javascript
JavaScript的单例模式 (singleton in Javascript)
Jun 11 Javascript
jQuery .tmpl(), .template()学习资料小结
Jul 18 Javascript
VueJs与ReactJS和AngularJS的异同点
Dec 12 Javascript
JavaScript手风琴页面制作
May 17 Javascript
解决vue单页面应用中动态修改title问题
Jun 09 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 Javascript
VUE实现图片验证码功能
Nov 18 Javascript
Javascript前端下载后台传来的文件流代码实例
Aug 18 Javascript
微信小程序实现录音Record功能
May 09 Javascript
JavaScript分页组件使用方法详解
Jul 26 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
PL-880隐藏功能
2021/03/01 无线电
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
Yii核心验证器api详解
2016/11/23 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
YUI的Tab切换实现代码
2010/04/11 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
Python程序暂停的正常处理方法
2019/11/07 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
物业管理工作方案
2014/05/10 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
六一儿童节标语
2014/10/08 职场文书
房屋所有权证明
2014/10/20 职场文书
南极大冒险观后感
2015/06/05 职场文书