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 相关文章推荐
国外Lightbox v2.03.3 最新版 下载
Oct 17 Javascript
kmock javascript 单元测试代码
Feb 06 Javascript
取得窗口大小 兼容所有浏览器的js代码
Aug 09 Javascript
Bootstrap入门书籍之(一)排版
Feb 17 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
Jun 24 Javascript
JS实现多张图片预览同步上传功能
Jun 23 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
Jun 01 Javascript
vuex实现及简略解析(小结)
Mar 01 Javascript
Node.js API详解之 os模块用法实例分析
May 06 Javascript
JS出现404错误原理及解决方案
Jul 01 Javascript
一分钟学会JavaScript中的try-catch
Dec 14 Javascript
html5 录制mp3音频支持采样率和比特率设置
Jul 15 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下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
Python 多线程的实例详解
2017/09/07 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
Python实现数值积分方式
2019/11/20 Python
python如何使用代码运行助手
2020/07/03 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
遗体告别仪式答谢词
2014/01/23 职场文书
详解Nginx 工作原理
2021/03/31 Servers
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技