前端vue-实现富文本组件

news2024/11/13 9:52:55

1.使用wangeditor富文本编辑器
工具网站:https://www.wangeditor.com/v4/
下载安装命令:npm i wangeditor --save
成品如下图:
在这里插入图片描述

组件实现代码

<template>
  <div>
    <!-- 富文本编辑器 -->
    <div id="wangeditor">
    </div>
  </div>
</template>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>

import { uploadImage } from '@/api/api'; // 导入图片上传api
import E from 'wangeditor';


export default {
  name: 'richText',
  components: {
  },
  props: {
    defaultDetails: {
      default: '请填写内容',
      type: String,
    },
  },
  watch: {
    htmlContent(val) {
      this.$emit('change', val); // 将改变同步到父组件
      if (this.validateEvent) {
        this.dispatch('ElFormItem', 'el.form.change', [val]);
      }
    }
  },
  data() {
    return {
      editor: null,
      htmlContent: '<p>hello</p>',
      firtherMethod: 'loadingCompleted', // 回调父组件,通知editor已经创建完成
    };
  },
  methods: {
    // 获取text文本
    getText() {
      const text = this.editor.txt.text();
      console.log('text = ', text);
      return text;
    },
    // 获取html
    getHtml() {
      const html = this.editor.txt.html();
      console.log('thml = ', html);
      return html;
    },
    // 图片上传自定义实现
    async uploadImage(files) {
      const file = files[0];
      console.log('Fuedit2-uploadImage file = ', file);
      const res = await uploadImage(obj);
      const path = SOCKET + (res.path || {});
      console.log('完整path = ', path);
      return path;
    },
    // 设置内容
    setHtml(html) {
      this.editor.txt.html(html);// 重新设置编辑器内容
    },
    // 追加内容
    appentHtml(html) {
      this.editor.txt.append(html);// 继续追加内容。
    },
    // 销毁编辑器
    beforeDestroy() {
      // 销毁编辑器
      console.log('销毁前');
      this.editor.destroy()
      console.log('销毁后');
      this.editor = null
    },
    // 清空编辑器内容
    clearText() {
      this.editor.txt.clear();
    },

    createEditor() {
      if(this.editor !== null) {
        return;
      }

      this.editor = new E('#wangeditor');
      // 或者 const editor = new E( document.getElementById('div1') )
      this.editor.config.height = 200; // 设置高度

      // 内容发生改变时回调
      // this.editor.config.onchange = function (html) {
        // this.htmlContent = html;
      // }

      this.editor.config.placeholder = this.defaultDetails; // 自定义初始文字提示

      this.editor.config.focus = false;// 取消初始化时自动聚焦

      this.editor.config.menus = [ // 定义显示哪些菜单和菜单的顺序。
        'head', // 标题
        'bold', // 粗体
        'fontSize', // 字号
        'fontName', // 字体
        'italic', // 斜体
        'underline', // 下划线
        // 'strikeThrough', // 删除线
        // 'indent',
        'lineHeight',
        'foreColor', // 文字颜色
        'backColor', // 背景颜色
        'link', // 插入链接
        'list', // 列表
        // 'todo',
        // 'justify', // 对齐方式
        // 'quote', // 引用
        // 'emoticon', // 表情
        'image', // 插入图片
        // 'table', // 表格
        // 'video', // 插入视频
        // 'code', // 插入代码
        'splitLine',
        'undo', // 撤销
        'redo', // 重复
      ];

      // this.editor.config.uploadImgServer = '/upload-img'; // 配置上传server 接口地址
      this.editor.config.uploadImgMaxSize = 2 * 1024 * 1024; // 图片上传max
      this.editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']; // 图片上传类型
      this.editor.config.uploadImgMaxLength = 1; // 一次最多上传 1 个图片

      this.editor.config.customUploadImg = async function (resultFiles, insertImgFn) { // 自定义图片上传实现
      // resultFiles 是 input 中选中的文件列表;insertImgFn 是获取图片 url 后,插入到编辑器的方法
        const file = resultFiles[0];
        const path = await uploadImage(file);//返回图片地址
        console.log('完整path = ', path);
      // 上传图片,返回结果,将图片插入到编辑器中
        insertImgFn(path);
      }

      // 使用base64格式保存本地图片,不可与uploadImgServer同时使用
      // this.editor.config.uploadImgShowBase64 = true;

      this.editor.create();

      // this.editor.txt.html('<p>用 JS 设置的内容</p>');// 重新设置编辑器内容
      // 第一步,初始化 textarea 的值
      // text1.val(this.editor.txt.html())
      console.log('this.editor = ', this.editor);
      // this.editor.txt.append('<p>追加的内容</p>');// 继续追加内容。

      // 创建完成,回调父组件
      try {
        this.$emit(this.firtherMethod, null);
      } catch (error) {
        console.log('editor 完成,回调父组件失败 error = ', error);
      }
    },
  },
  mounted() {
    this.createEditor();
  },
};
</script>

<style lang="css"  src="">
/* @import '../css/Cnel.css';

/* 使用style属性src引入外部css,仅在当前s组件有效 */
</style>


组件使用方式

RichText: () => import('@/components/RichText.vue'),









<rich-text v-model="details" ref="fueditModule" @loadingCompleted="loadingCompleted"></rich-text>

export default Vue.extend({
  name: 'UpdateText',
  components: {
    RichText: () => import('@/components/RichText.vue'),
  },
  methods: {
  	// 富文本组件加载完成回调
    loadingCompleted() {
      try {
        console.log('editor加载完成,回调父组件');
        // this.details = this.$refs.fueditModule.setHtml('<p><b>招商会详情!!</b></p>');
      } catch (error) {
        console.log('打开弹窗 err =', error);
      }
    },
	// 调用子组件获取富文本内容
	this.details = this.$refs.fueditModule.getHtml();
	// 调用子组件设置富文本内容
	this.$refs.fueditModule.setHtml('<p><b>设置详情!!</b></p>');
	// 调用子组件销毁富文本编辑框
	this.$refs.fueditModule.beforeDestroy();
  }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Recbole安装指南:步骤详解与常见问题解决方案

1.两种方式&#xff1a; 从Conda安装 如果你还没有安装Conda&#xff0c;可以安装Miniconda或完整的Anaconda。 如果你在中国大陆&#xff0c;我们推荐你使用清华镜像安装Conda。 当你完成Conda的安装后&#xff0c;你可以将RecBole安装在python 3.7的Conda环境中&#xff0…

数据结构之树(下),你真的懂吗?

数据结构入门学习&#xff08;全是干货&#xff09;——树&#xff08;下&#xff09; 1 堆 (Heap) 1.1 什么是堆 堆 (Heap) 是一种特殊的完全二叉树&#xff0c;分为最大堆和最小堆。 最大堆&#xff1a;每个节点的值都大于或等于其子节点的值&#xff0c;根节点是整个堆的…

YOLOv9改进策略【注意力机制篇】| MCAttention 多尺度交叉轴注意力

一、本文介绍 本文记录的是基于MCA注意力模块的YOLOv9目标检测改进方法研究。普通的轴向注意力难以实现长距离交互&#xff0c;不利于捕获分割任务中所需的空间结构或形状&#xff0c;而MCA注意力模块通过构建了两个并行轴向注意力之间的交互&#xff0c;更有效地利用多尺度特…

2.4 卷积2

2.4.2 复正弦波与整体方案 在2.3节中&#xff0c;我们提出了关于复正弦输入的频域输出及其意义的两个问题。为了研究这些问题&#xff0c;我们让一个具有真实脉冲响应 h [ n ] h[n] h[n]&#xff08;即 h Q [ n ] 0 h_Q[n] 0 hQ​[n]0&#xff09;的LTI系统通过输入复正弦…

数据结构(Day16)

一、学习内容 1、有关顺序表的操作&#xff08;功能函数&#xff09; 1、创建顺序表 Plist create_list(){Plist L malloc(sizeof(list)); // 为顺序表分配内存空间if(NULL L){printf("申请空间失败\n");return NULL; // 如果内存分配失败&#xff0c;返回 NU…

RTMP协议在无人机巡检中的应用场景

为什么要用无人机巡检 好多开发者对无人机巡检技术方案&#xff0c;相对陌生&#xff0c;实际上&#xff0c;无人机巡检就是利用无人机对特定区域或设施进行定期或不定期的检查。这种巡检方式相比传统的人工巡检具有显著的优势&#xff0c;包括速度快、覆盖广、风险低、准确性…

Tornado 是一个 Python 异步网络库和 web 框架

Tornado 是一个 Python 异步网络库和 web 框架&#xff0c;它最初由 FriendFeed 开发&#xff0c;后来被 Facebook 收购并开源。Tornado 因其非阻塞的 I/O 操作和优秀的性能而广受欢迎&#xff0c;特别是在需要处理大量并发连接的应用中。Tornado 的底层实现主要依赖于 Python …

神经网络通俗理解学习笔记(0) numpy、matplotlib

Numpy numpynumpy 基本介绍Ndarray对象及其创建Numpy数组的基础索引numpy数组的合并与拆分&#xff08;重要&#xff09;numpy数组的矩阵运算Numpy数组的统计运算numpy中的arg运算numpy中的神奇索引和比较 Matplotlib numpy numpy 基本介绍 numpy 大多数机器学习库都用了这个…

【Linux入门】基本指令(一)

目录 一.使用环境 二.快捷键 三. 登录与用户管理 1.ssh root[ip地址] 2.whoami 3.ls /home 4.adduser [用户名] 5.passwd [用户名] 四.目录文件操作 1.ls 2.pwd 3.cd 4.touch 5.mkdir 6.rm 7.cp 五.命令手册 一.使用环境 云服务器&#xff1a;市面上有很多&am…

Python 中的 typing 模块常见用法

typing 模块是 Python 提供的一个标准库&#xff0c;主要用于为函数、变量和类定义类型提示&#xff08;Type Hints&#xff09;&#xff0c;从而提高代码的可读性和类型安全性。虽然 Python 是动态类型语言&#xff0c;但通过 typing 模块&#xff0c;开发者可以明确指定变量和…

TMStarget学习——Functional Connectivity

今天基于结构像和功能像数据试验操作TMStarget 的第二个功能模块Functional Connectivity。参考季老师的文档PPT来学习的&#xff0c;整个处理过程蛮长的&#xff0c;可能配置原因一路上报错也比较多&#xff0c;下面还是逐步记录吧&#xff0c;后面采用连更的方式直到跑通后再…

C++ 中的继承(详细讲解)

一、继承的概念以及定义 1、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的…

微波无源器件 功分器 4 一种用于天线阵列的紧凑宽带四路双极化波导功分器

摘要&#xff1a; 一种新型紧凑和高效率&#xff0c;在一个同相2x4方案(四路)显示双极化的功分器的设计和仿真被提出了&#xff0c;两个基本的正交模式TE10和TE01在四个方波导处同相输出通过使用四个3端口个四个E面和两个H面功分结构。此功分末端接了两个商用波导(WR75)端口&am…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务&#xff0c;这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例&#xff0c;首先登录阿里云&#xff0c;在控制台找到数字证书管理服务&#xff0c;进…

膨胀罐选型计算和其他事项

膨胀罐&#xff0c;也称定压罐、气压罐&#xff0c;广泛应用于空调、太阳能、锅炉等暖通系统以及供水和消防设备&#xff0c;缓冲系统压力波动&#xff0c;消除水锤&#xff0c;起到稳压卸荷的作用。在空调、太阳能、锅炉、地暖等闭式循环系统中&#xff0c;膨胀罐的作用是在工…

3.数据类型

作业系统链接 Python 是一门面向对象友好的语言&#xff0c;支持多种内置数据类型&#xff0c;包括整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、布尔值&#xff08;bool&#xff09;、字符串&#xff08;str&#xff09;、列表&#xff08;list&am…

直流电表如何在新能源领域进行应用

直流电表在新能源领域的应用广泛且深入&#xff0c;其高精度、实时监测和数据分析能力为新能源系统的运行、管理和优化提供了重要支持。 一、太阳能光伏发电系统 在太阳能光伏发电系统中&#xff0c;直流电表扮演着至关重要的角色。太阳能电池板将光能转化为直流电能&#xf…

.NET 一直跻身 30 大Github最活跃开源项目之列。

大家好&#xff0c;我是编程乐趣。 一直以来都在介绍.Net的热门开源项目&#xff0c;今天来说说.Net本身。 .Net在GitHub上也是一个开源项目&#xff0c;.NET 是一个由 Microsoft 和 .NET 社区共同维护的开源跨平台框架。 自 2017 年以来&#xff0c;.NET 一直是 GitHub 上最…

新手教学系列——非正常关机导致MySQL权限表(db)损坏及修复详解

在使用MySQL的过程中,我们常常会遇到一些问题,尤其是当服务器或主机非正常关机或重启时,MySQL的某些表,特别是权限表(如 mysql.db 表),可能会损坏,导致数据库无法启动或访问。这种情况对生产环境的数据库系统来说是相当严重的,因此掌握修复方法非常重要。 本篇文章将…

分享两个ADG监控脚本

分享两个监控脚本&#xff0c;用于监控Oracle ADG的状态&#xff0c;如果状态异常则发送邮件告警 脚本一&#xff1a; 利用语句查询日志的应用状态&#xff0c;如果长时间未应用则邮件告警&#xff0c;提醒DBA检查ADG的状态是否异常&#xff1b; 阈值条件&#xff1a;最近一…