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脚本复制网页上的一个表格的不错实现方法
Dec 29 Javascript
javascript 进度条 实现代码
Jul 30 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
javaScript同意等待代码实现心得
Jan 01 Javascript
javascript 获取函数形参个数
Jul 31 Javascript
详解JavaScript基于面向对象之继承实例
Dec 16 Javascript
jQuery插件ajaxFileUpload异步上传文件
Oct 19 Javascript
Vue实现自带的过滤器实例
Mar 09 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
微信小程序开发animation心跳动画效果
Aug 16 Javascript
js使用原型对象(prototype)需要注意的地方
Aug 28 Javascript
JS实现页面内跳转的简单代码
Sep 03 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+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript 事件系统
2010/07/22 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
html5弹跳球示例代码
2013/07/23 HTML / CSS
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
食品安全责任书
2014/04/15 职场文书
给市场的环保建议书
2014/05/14 职场文书
广播节目策划方案
2014/05/23 职场文书
企业宣传策划方案
2014/05/29 职场文书
个人催款函范文
2015/06/23 职场文书