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 相关文章推荐
得到文本框选中的文字,动态插入文字的js代码
Mar 07 Javascript
浅析tr的隐藏和显示问题
Mar 05 Javascript
jquery常用方法及使用示例汇总
Nov 08 Javascript
javascript实现图片循环渐显播放的方法
Feb 24 Javascript
JS设置网页图片vspace和hspace属性的方法
Apr 01 Javascript
JS控制伪元素的方法汇总
Apr 06 Javascript
js获取页面及个元素高度、宽度的代码
Apr 26 Javascript
vue.js国际化 vue-i18n插件的使用详解
Jul 07 Javascript
Vue.js递归组件构建树形菜单
Dec 24 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
Dec 25 Javascript
实例学习JavaScript读取和写入cookie
Jan 29 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
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 sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
简单的分页代码js实现
2016/05/17 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
详解JavaScript 高阶函数
2020/09/14 Javascript
python创建列表并给列表赋初始值的方法
2015/07/28 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
打包发布Python模块的方法详解
2016/09/18 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python中for用来遍历range函数的方法
2018/06/08 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
python与mysql数据库交互的实现
2020/01/06 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
集体婚礼证婚词
2014/01/13 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
小学科学教学计划
2015/01/21 职场文书
Python闭包的定义和使用方法
2022/04/11 Python