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 相关文章推荐
对textarea框的代码调试,而且功能上使用非常方便,酷
Jun 30 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
Jun 10 Javascript
jquery nth-child()选择器的简单应用
Jul 10 Javascript
js 回车提交表单两种实现方法
Dec 31 Javascript
原生javascript获取元素样式
Dec 31 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
Nov 04 Javascript
javascript实现方法调用与方法触发小结
Mar 26 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
May 24 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
Aug 25 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
Mar 08 Javascript
Vue实现日历小插件
Jun 26 Javascript
js实现tab栏切换效果
Aug 02 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
短波的认识
2021/03/01 无线电
PHP时间戳使用实例代码
2008/06/07 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
详解Python中的循环语句的用法
2015/04/09 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
python psutil库安装教程
2018/03/19 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
pandas 数据类型转换的实现
2020/12/29 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
管理站站长岗位职责
2013/11/27 职场文书
打架检讨书300字
2014/02/02 职场文书
安全生产实施方案
2014/02/23 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
社区综治工作汇报
2014/10/27 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python