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 style 中visibility和display之间的区别
Jan 22 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
如何防止回车(enter)键提交表单
May 11 Javascript
JS实现动态给图片添加边框的方法
Apr 01 Javascript
jquery实现简单的二级导航下拉菜单效果
Sep 07 Javascript
使用javascript插入样式
Mar 14 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
Nov 24 Javascript
ztree实现权限横向显示功能
May 20 Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
Jul 31 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
Dec 05 Javascript
在微信小程序中使用vant的方法
Jun 07 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检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
Python动态加载模块的3种方法
2014/11/22 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
接口的多继承会带来哪些问题
2015/08/17 面试题
校本教研工作制度
2014/01/22 职场文书
客服专员岗位职责
2014/02/28 职场文书
机关出纳岗位职责
2014/04/03 职场文书
小学二年级评语
2014/04/21 职场文书
倡议书范文格式
2014/05/12 职场文书
机械操作工岗位职责
2014/08/08 职场文书
中职招生先进个人材料
2014/08/31 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
长城的导游词
2015/01/30 职场文书
神龙架导游词
2015/02/11 职场文书
英语辞职信怎么写
2015/02/28 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript