富文本编辑器 ck-editor5 的使用

news/2024/7/10 1:24:11 标签: 前端, javascript, vue

最近在项目中需要用到富文本编辑器,据说ck-editor5很不错,于是就使用它了,不过在期间也遇到了很多问题,这里记录下。

一、引入ck-editor5

文档地址:Predefined builds - CKEditor 5 Documentation

这里有个坑,我最初是根据文档执行下面的npm命令下载的,最后捣腾了半天发现里面功能不全,就是一个简单版本的ck-editor

所以不推荐使用

npm install --save @ckeditor/ckeditor5-build-classic

推荐引入方式:

 自定义配置自己所需要的功能生成build文件然后在项目中引入

自定义配置地址:CKEditor 5 Online Builder | Create your own editor in 5 steps

1. 选择一个自己喜欢的风格 - 这里我选择第一个 

2. 添加自己所需要的功能 - 部分功能可能收费 - 选择免费的就可以(标签上带图标的收费 - 猜测)

3.  调整工具栏的位置 - 就算这里位置调错也没事,之后也可以在代码中修改

 4. 选择一种语言 进行下一步

 5. 最后开始生成代码文件就自定义完成了

 6. 最后下载生成的文件

 二、在项目中引入ck-editor5

下载出来的文件中build是刚刚配置完成后打包后的文件

如果需要重新调整工具栏的位置 - 只需要改变这边代码的顺序然后执行npm命令

npm install  npm run build 就能重新生成一个新的build文件

将下载下来文件中的build文件放到自己的项目中

 三、在项目中使用

1. 如果添加了上传图片的功能则需要写一个上传文件的类(这里是也是百度了许久得出的答案)

 创建一个 UploadAdapter.js 文件,代码如下:

javascript">/**
 * 配合ckeditor编辑器的上传类
 * */
export default class UploadAdapter {
    // 加载器
    #loader;
    // 上传的地址
    #uploadFileUrl = "";

    /** 构造方法 */
    constructor(loader) {
        this.loader = loader;
    }

    /** 上传方法 */
    upload() {
        this.loader.file.then(res => {
            console.log(res)
        });
    }

    /** 中止上传过程方法 */
    abort() {}
}

 2. 最后一步,使用,直接上代码

我这里是用vue3的,这里获取到的editor对象不能与reactive和ref有关联,单独放在外面就好,不需要响应式!

<template>
	<div>
		<div id="ck-editor"></div>

		<button @click="handleClick">获取内容</button>
	</div>
</template>

<script lang="ts">
import { defineComponent, reactive, toRefs, onMounted, toRaw } from 'vue';
import UploadAdapter from './UploadAdapter.js';

export default defineComponent({
	setup() {
		const state = reactive({});
		let editor: any = null;

		onMounted(() => {
			(window as any).ClassicEditor.create(document.getElementById("ck-editor")).then((_editor: any ) => {
				_editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {
					return new UploadAdapter(loader);
				};

				editor = _editor;
			})
		})

		const handleClick = () => {
			console.log(editor.data.get())
		}

		return {
			...toRefs(state),
			handleClick,
		}
    }
});
</script>

四、最后执行代码  - 点击按钮后就能拿到想要的数据了😀


http://www.niftyadmin.cn/n/14333.html

相关文章

Redis的分布式锁问题(十)最强分布式锁工具:Redisson

Redisson的引入 我们先来看看之前的基于setnx实现的分布式锁存在的问题&#xff1a; 我们之前实现的分布式锁是基于redis的setnx命令的特性的&#xff01; 但是&#xff0c;这样子实现起来会有很多弊端&#xff01; 不可重入 简单的来说就是一旦setnx [key] [value]后&…

搭建springWeb保姆级教程

经过我们对mybatis和spring框架的学习&#xff0c;我们即将要用框架进行前后端数据交互&#xff0c;已经脱离了那种用servlet的方式进行数据传输&#xff0c;今天让我们来搭建最基本的springweb框架&#xff01;&#xff01;&#xff01; 1.创建一个web项目 1. 2. 选择一个we…

写一个flutter程序2

需求 完成一个简单的移动应用程序&#xff0c;功能是&#xff1a;为一个创业公司生成建议的名称。用户可以选择和取消选择的名称、保存&#xff08;收藏&#xff09;喜欢的名称。该代码一次生成十个名称&#xff0c;当用户滚动时&#xff0c;会生成一新批名称。用户可以点击导…

OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)

裁剪是为了从图像中删除所有不需要的物体或区域。甚至突出显示图像的特定功能。 使用OpenCV裁剪没有特定的功能&#xff0c;NumPy数组切片是工作。读取的每个图像都存储在2D数组中&#xff08;对于每个颜色通道&#xff09;。只需指定要裁剪区域的高度和宽度&#xff08;以像素…

家政小程序开发,改变传统难题

首先来说说家政小程序的优势&#xff1a;过去家政门店是根据四处贴到广告宣传、发传单、亲朋好友推 荐等方法处于被动等候顾客上门服务&#xff0c;拓客高效率较低&#xff0c;而且 服务销售市场还存有混乱市场竞争、供求不平衡、员工行为规范参差不齐等难题&#xff0c;限定了…

【GD32F427开发板试用】IAR flash loader 下载GD32F427流程简要分析

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;andeyqi 很高兴获的社区的GD32F427开发板的评测机会&#xff0c;这几年芯片慌大家都能感受到&#xff0c;项目上经常因为货源紧张不断更换替代…

如何用 7 分钟击破 Serverless 落地难点?

当前&#xff0c;Serverless 覆盖的技术场景正在不断变广。Serverless 已在微服务、在线应用、事件驱动、任务处理等众多场景被验证且广泛应用 。当你想要部署一个网站时&#xff0c;需要自己购买服务器并花费时间去维护&#xff0c;造成资源浪费不说&#xff0c;还要耗费精力。…

通信基础之天线知识梳理---2022/12/05

天线知识梳理基本振子的辐射和天线电参数天线阵常用线天线天线测量声明&#xff1a; 学习资料来源于慕课。 哈工大的天线原理课程 基本振子的辐射和天线电参数 天线电参数主要有&#xff1a; 方向性函数、方向图、方向性系数、辐射电阻、效率、增益、输入阻抗、频带、极化。 天…