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 相关文章推荐
javascript document.images实例
May 27 Javascript
探讨javascript是不是面向对象的语言
Nov 21 Javascript
24款热门实用的jQuery插件推荐
Dec 24 Javascript
jQuery中next()方法用法实例
Jan 07 Javascript
JavaScript数据库TaffyDB用法实例分析
Jul 27 Javascript
VueJs 将接口用webpack代理到本地的方法
Nov 27 Javascript
谈谈vue中mixin的一点理解
Dec 12 Javascript
Vue写一个简单的倒计时按钮功能
Apr 20 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 Javascript
国内常用的js类库大全(CDN公共库)
Jun 24 Javascript
解决vue项目 build之后资源文件找不到的问题
Sep 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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
php-msf源码详解
2017/12/25 PHP
提高网站信任度的技巧
2008/10/17 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
Python中super关键字用法实例分析
2015/05/28 Python
在Django框架中编写Contact表单的教程
2015/07/17 Python
python实现网站的模拟登录
2016/01/04 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
Django admin组件的使用
2020/10/24 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
高中生操行评语大全
2014/04/25 职场文书
中国梦团日活动总结
2014/07/07 职场文书
给校长的一封检讨书
2014/09/20 职场文书
安徽导游词
2015/02/12 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
MySQL批量更新不同表中的数据
2022/05/11 MySQL