vue2 如何实现div contenteditable=“true”(类似于v-model)的效果


Posted in Javascript onFebruary 08, 2017

发现问题

在 vue2 中对表单控件有着良好的双向数据绑定机制,但是对于要特定实现某些功能的输入时,我们就不得不使用到 contenteditable="true" 的 div ,而在这个 div 上是使用 v-model 是没有效果的。那么问题就来了,输入是非常需要双向绑定的,这里的双向数据绑定该如何实现?

解决思路一:自定义指令

当然,说在这一段的前面,这种解决方式在 vue2 中是不行的,为什么这么说,因为现在去搜索这个问题绝大多数的搜索结果是这个,所以放在前面。

实现的原理以及为什么不能用了

原理:自定义一个双向数据绑定的指令,代码如下:

Vue.directive('demo', {
 twoWay: true,
 bind: function () {
 this.handler = function () {
  this.set(this.el.innerHTML)
 }.bind(this)
 this.el.addEventListener('input', this.handler)
 },
 update: function (newValue, oldValue) {
 this.el.innerHTML = newValue || ''
 },
 unbind: function () {
 this.el.removeEventListener('input', this.handler)
 }
})

至于 this 下的这些方法,在 vue 官网上可能不太容易找到,因为这些是 vue1 中的内容,而在 vue2 中已经被移除了。所以在 vue2 中我们是不能这么干的,当然如果你使用的是 vue1 那么完全没问题,直接拿去用即可。

解决思路二:使用组件

单独声明一个组件,在组件内部处理数据(也就是innerHTML),并将数据返回给父组件。

代码如下:

<template>
 <div contenteditable="true"
  v-html="innerText"
  @input="changeText"></div>
</template>
<script>
 export default {
 props: ['value'],
 data(){
  return {innerText:this.value}
 },
 methods:{
  changeText(){
  this.innerText = this.$el.innerHTML;
  this.$emit('input',this.innerText);
  }
 }
 }
</script>

然后在父组件中直接使用 v-model 就可以了(这里我把组件名称定义成了 v-edit-div)。

<template>
 <div>
 <v-edit-div v-model='text'></v-edit-div>
 <span>{{text}}</span>
 </div>
</template>
<script>
 export default {
 data(){
  return {
  text:'改一下试一试',
  }
 }
 }
</script>

至于为什么可以直接用 v-model ,看官网的 API 吧。

v-model 传送门

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jQuery lazyload 的重复加载错误以及修复方法
Nov 19 Javascript
IE事件对象(The Internet Explorer Event Object)
Jun 27 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
JS实现文字向下滚动完整实例
Feb 06 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
JavaScript原型继承_动力节点Java学院整理
Jun 30 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
Aug 24 Javascript
JS简单获取并修改input文本框内容的方法示例
Apr 08 Javascript
JS实现方形抽奖效果
Aug 27 Javascript
微信小程序实现留言功能
Oct 31 Javascript
element ui table 增加筛选的方法示例
Nov 02 Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 #Javascript
node.js的事件机制
Feb 08 #Javascript
jQuery多选框选择数量限制方法
Feb 08 #Javascript
Node.js连接MongoDB数据库产生的问题
Feb 08 #Javascript
简单实现bootstrap选项卡效果
Feb 08 #Javascript
Bootstrap导航条学习使用(一)
Feb 08 #Javascript
Vue过滤器的用法和自定义过滤器使用
Feb 08 #Javascript
You might like
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
php分页示例分享
2014/04/30 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
详解Python学习之安装pandas
2019/04/16 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
PHP面试题附答案
2015/11/28 面试题
教师节感恩老师演讲稿
2014/08/28 职场文书
2015年科室工作总结
2015/04/10 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android