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 相关文章推荐
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
jQuery中document与window以及load与ready 区别详解
Dec 29 Javascript
Javascript中数组sort和reverse用法分析
Dec 30 Javascript
jQuery使用addClass()方法给元素添加多个class样式
Mar 26 Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 Javascript
Node.js Addons翻译(C/C++扩展)
Jun 12 Javascript
限时抢购-倒计时的完整实例(分享)
Sep 17 Javascript
vue实现模态框的通用写法推荐
Feb 26 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
小程序日历控件使用方法详解
Dec 29 Javascript
layui实现数据表格table分页功能(ajax异步)
Jul 27 Javascript
微信小程序 scroll-view 实现锚点跳转功能
Dec 12 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新手用的Insert和Update语句构造类
2012/03/31 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
项目实践之javascript技巧
2007/12/06 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
jQuery 选择器用法实例分析【prev + next】
2020/05/22 jQuery
python处理图片之PIL模块简单使用方法
2015/05/11 Python
TensorFlow实现创建分类器
2018/02/06 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
python实现大学人员管理系统
2019/10/25 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
利用python爬取有道词典的方法
2020/12/08 Python
python实现经典排序算法的示例代码
2021/02/07 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
企业管理培训感言
2014/01/27 职场文书
学校计划生育责任书
2015/05/09 职场文书
委托收款证明
2015/06/23 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL