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 相关文章推荐
IE bug table元素的innerHTML
Jan 11 Javascript
javascript delete 使用示例代码
Mar 29 Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 Javascript
js向上无缝滚动,网站公告效果 具体代码
Nov 18 Javascript
javascript正则匹配汉字、数字、字母、下划线
Apr 10 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
Feb 17 Javascript
简单实现jQuery多选框功能
Jan 09 Javascript
了解VUE的render函数的使用
Jun 08 Javascript
如何去除vue项目中的#及其ie9兼容性
Jan 11 Javascript
vue2.0学习之axios的封装与vuex介绍
May 28 Javascript
Vue核心概念Getter的使用方法
Jan 18 Javascript
node中使用log4js4.x版本记录日志的方法
Aug 20 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递归函数返回值使用方法
2013/02/18 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
php中stdClass的用法分析
2015/02/27 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
大学生职业生涯规划书参考模板
2014/03/05 职场文书
小学教师工作总结2015
2015/04/07 职场文书
2015年派出所工作总结
2015/04/24 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技