广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue实现contenteditable元素双向绑定的方法详解
  • 416
分享到

Vue实现contenteditable元素双向绑定的方法详解

2024-04-02 19:04:59 416人浏览 独家记忆
摘要

目录前言contenteditable基础使用进阶使用总结前言 如何实现一个即时通讯的聊天页面,网上有很多的开源或不开源的成品,可以直接使用,或者简单修改后使用。但在实际项目中,直接

前言

如何实现一个即时通讯的聊天页面,网上有很多的开源或不开源的成品,可以直接使用,或者简单修改后使用。但在实际项目中,直接使用开源的即时通讯往往不是我们想要的,如何自己开发一个聊天页面呢。本文就着学习的目的,从0开始一步步实现一个聊天框的开发,至于消息的发送和接收,这个就得依靠后端大佬了。

在开发前,首先得明确用什么来实现。用input输入框和textare文本输入肯定是不行的,这两个只能输入文本类数据(输入法表情也算),想要在输入框内展示图片、表情包或回复消息等复杂内容时就不行了。灵光一闪,展示图片这些用富文本不就好了,但仔细想想,使用富文本不就引入额外的组件了嘛。想要自己实现一个类似“富文本”输入框,就需要借助contenteditable来实现。

本项目需要解决的问题:

实现一个可输入文本、图片等复杂消息的输入框

实现数据的“双向绑定”

contenteditable

contenteditable是所有html元素都有的枚举属性,表示元素是否可以被用户编辑。可用于所有元素,但是不是所有元素对该属性都起作用。如果元素支持该属性,并且设置了contenteditable,则浏览器会修改元素以允许编辑。

关于contenteditable需要注意:

  • true或者空字符串,表示元素可编辑
  • false,表示元素不可编辑
  • 如果没有设置该属性的值,则其值被视为空字符串
  • 如果没有设置该属性或者设置了无效值,则其值默认继承自父元素。如果父元素是可编辑的,那么该子元素也是可编辑的;否则,该子元素不可编辑。
  • 虽然该属性可以设置true、false,但是contenteditable是一个枚举属性而不是布尔属性。

本项目采用对div增加contenteditable属性实现输入框。

基础使用

首先新建一个Vue项目(如果只是实现demo,也可以不创建Vue项目),vue create simple-chat-inputbox,采用默认的即可(新版vue-cli默认新建的是vue3项目,本项目采用Vue2)。

然后进入项目,npm run serve运行起来,不运行怎么能看到效果呢。

在实际开发前,先做好准备工作:

  • 初始化本地仓库,并关联远端仓库(可选)
  • 取消App.vue中的默认样式,隐藏HelloWorld

新建InputBox.vue,作为输入框组件

...
<div class="input-box" contenteditable="true"></div>
...
<style scoped>
.input-box {
  width: 400px;
  height: 250px;
  border: 1px solid #6e6e6e;
  outline: none; 
  padding: 10px;
}
</style>

注册并引入InputBox.vue,运行后如下图:

此时就可以在输入框中就可以输入你想输入的内容,但是仅仅是输入,怎么获取值,以及怎么实现双向绑定呢。

进阶使用

在自定义事件 — vue.js (vuejs.org)有一句话:

一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,仍然需要在组件的 props 选项里声明 value 这个 prop

根据此特性,我们再来改造一下项目:

虽然div变成了可编辑,但是并不能input一样直接使用v-model来完成双向绑定,但我们可以另辟蹊径,模拟实现双向绑定。首先我们需要创建两个组件:InputBox.vueDivEditable.vue,分别表示父组件和子组件,对外只提供父组件。

对于父组件来说,只需要使用v-model传入值就行。

// InputBox.vue
<template>
  <div>
    <DivEditable v-model="inputContent" />
    <input type="text" v-model="inputContent">
    <div @click="changeValue">父组件修改子组件的值</div>
  </div>
</template>
<script>
import DivEditable from '@/components/DivEditable'
export default {
  name: 'inputBox',
  data() {
    return {
      inputContent: '',
    }
  },
  watch: {
    inputContent(val) {
      console.log('父组件接收到的输入框的值', val);
    }
  },
  components: {
    DivEditable
  },
  methods: {
    changeValue() {
      this.inputContent = this.model1;
    }
  }
}
</script>

子组件处理就相对复杂点,需要接收值并且监听事件:

<template>
  <div ref="editor" class="input-box" contenteditable="true" @input="inputText" @blur="inputBlur" @focus="inputFocus"></div>
</template>
<script>
export default {
  name: 'inputBox',
  props: ['value'], // 父组件v-model绑定的prop
  data() {
    return {
      isBlur: true, // 解决赋值时光标自动定位到起始位置
    }
  },
  watch: {
    value(val) {
      if (this.isBlur) {
        this.$refs.editor.innerHTML = val;
      }
    }
  },
  methods: {
    // 监听输入框内容
    inputText() {
      console.log('子组件输入框的输入内容', this.$refs.editor.innerHTML);
      this.$emit('input', this.$refs.editor.innerHTML);
    },
    inputFocus() {
      this.isBlur = false;
    },
    inputBlur() {
      this.isBlur = true;
    }
  }
}
</script>
<style scoped>
.input-box {
  width: 400px;
  height: 250px;
  border: 1px solid #6e6e6e;
  outline: none; 
  padding: 10px;
}
</style>

虽然div不可以使用v-model,但是可以监听inputfocusblur等事件。上述代码其实并不复杂,主要就是利用了v-model的特性。有一点需要说明,由于是“双向绑定”,子组件里面输入的值会通过父组件赋值到子组件,导致子组件的光标始终处于起始位置,因此需要增加一个isBlur变量,用来解决这个问题。感兴趣的可以试一下去掉isBlur会是什么效果。

运行结果如下图:

通过修改父组件输入框的值,子组件对应的值也会发生改变;同理,修改子组件也是同样的效果。基本实现了“双向绑定”。

总结

本文基于contenteditable,实现可“双向绑定”的输入框

实现双向绑定,可以动态赋值,或者根据用户的输入实时处理,例如输入@的时候弹出渲染的弹窗,在选择用户后再插入到输入框

项目完整代码可参考 项目地址,接下来将陆续介绍怎么实现粘贴文本、图片,以及对光标的处理。

到此这篇关于Vue实现contenteditable元素双向绑定的方法详解的文章就介绍到这了,更多相关Vue元素双向绑定内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue实现contenteditable元素双向绑定的方法详解

本文链接: https://www.lsjlt.com/news/148058.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue实现contenteditable元素双向绑定的方法详解
    目录前言contenteditable基础使用进阶使用总结前言 如何实现一个即时通讯的聊天页面,网上有很多的开源或不开源的成品,可以直接使用,或者简单修改后使用。但在实际项目中,直接...
    99+
    2022-11-13
  • Vue双向绑定原理及实现方法
    目录双向绑定示例vue3双向绑定双向绑定 Vue 的双向绑定是通过数据劫持和发布-订阅模式实现的。 当 Vue 实例初始化时,它会对 data 选项中的每个属性使用 Object.d...
    99+
    2023-05-17
    Vue双向绑定 Vue3双向绑定实现
  • vue实现双向绑定的方法有哪些
    在vue中实现双向绑定的方法有:1.使用v-model指令实现;2.利用.sync修饰符实现;3.使用model属性实现;在vue中实现双向绑定的方法有以下几种使用v-model指令实现双向绑定<input v-model=...
    99+
    2022-10-17
  • vue实现双向绑定有哪几个方法
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。Vue 实现双向绑定的几种方法1、v-model 指令<ChildComponent v-model="pageTitle" /> &l...
    99+
    2023-05-14
    数据双向绑定 Vue.js
  • Vue数据双向绑定的实现方式讲解
    目录前言一、input和textarea二、radio和CheckBox三、select四、双向绑定的修饰符前言 在web开发应用中,很多项目都会用到表格一列的组件进行数据的传输、获...
    99+
    2022-11-13
  • 详解用Vue怎么实现数据的双向绑定
    在Vue.js中,双向数据绑定是一项非常强大的功能,它能够使数据和视图之间保持同步,让开发者更加方便地操作数据。在本文中,我们将介绍如何用Vue.js实现数据的双向绑定。1. 理解双向绑定首先,我们需要了解双向绑定的原理。在Vue.js中...
    99+
    2023-05-14
    Vue.js
  • 详解Vue中双向绑定原理及简单实现
    目录监听器订阅器双向绑定构造函数编译器(1)Compile类(2)node2Fragment函数(3)compile函数总结效果完整代码代码缺陷监听器 vue实现双向绑定时,首先要实...
    99+
    2023-05-19
    Vue双向绑定原理 Vue实现双向绑定 Vue双向绑定
  • Vue2.0/3.0双向数据绑定的实现原理详解
    Vue2.0/3.0 双向数据绑定的实现原理 双向数据绑定简意 即数据的改变能让页面重新渲染 Vue2.0 ES5的原理: Object.defineProperty 对数据进行拦...
    99+
    2022-11-12
  • js项目中双向数据绑定的简单实现方法
    目录前言发布订阅者模式结果调用总结前言 双向数据绑定 指的是当对象的属性发生变化时能够同时改变对应的UI,反之亦然。换句话说,如果我们有一个user对象,这个对象有一个name属性...
    99+
    2022-11-12
  • C#实现数组元素的数据类型转换方法详解
    目录一、场景假设二、解决方案三、问题延伸四、数组类的静态转换方法五、刨根问底一、场景假设 假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开。要求用此字符串中的数字...
    99+
    2022-11-13
  • Java文件重定向和加载的原理和实现方法详解。
    Java文件重定向和加载的原理和实现方法详解 Java文件重定向和加载是Java开发中常用的技术,它们可以帮助我们更好地管理程序的输入输出和加载类文件。本文将详细介绍Java文件重定向和加载的原理和实现方法,并给出相应的演示代码。 一、Ja...
    99+
    2023-09-05
    文件 重定向 load
  • Java和Linux教程:重定向的应用场景及实现方法详解!
    重定向是计算机中常用的一种技术,它可以将程序的输出结果或错误信息输出到指定的文件或设备中,从而方便我们进行查看和处理。在Java和Linux中,重定向也是一种非常常用的技术,本文将详细介绍重定向的应用场景及实现方法。 一、Java中的重定...
    99+
    2023-06-04
    linux 教程 重定向
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作