基于 React-draft-wysiwyg 实现的 react 富文本编辑器组件 开箱即用
工作中遇到了一个需要做图文详情 的富文本编辑的需求,
于是基于 React-draft-wysiwyg 实现了一个 纯组件,
目前支持 常规文本输入 外部链接图片 以及本地上传图片,
由于是纯组件, 可直接放在react 项目中引入使用
具体项目中使用十分方便, 一行代码搞定,
<EditorVan editorState={this.state.editorState} transformHTML={(editorState) => this.setState({ editorState })} />
上面代码中的 props.editorState 为对当前富文本编辑组件传入的值, 类型为字符串, 传入后 EditorVan 会自行对字符串进行解析,最终显示为 html 格式,
import React, { Component } from 'react';
import { Editor } from 'react-draft-wysiwyg';
import { EditorState, convertToRaw, ContentState } from 'draft-js';
import draftToHtml from 'draftjs-to-html';
import htmlToDraft from 'html-to-draftjs';
import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';
// 这里的 UploadBase64 是我的图片上传接口
import { UploadBase64 } from '@/services/common_services';
// 这里的 IMG_URL 图片的 Host, 因为上面的接口上传成功返回的是一个相对路径 页面展示时需要自行拼接 Host。 这两处, 大家可根据实际情况自行修改
import { IMG_URL } from '@/utils';
const transformDraftStateToHtml = (editorState) => {
if (!editorState.getCurrentContent) {
return '';
}
return draftToHtml(convertToRaw(editorState.getCurrentContent()));
};
const transformHtmlToDraftState = (html = '') => {
const blocksFromHtml = htmlToDraft(html);
const { contentBlocks, entityMap } = blocksFromHtml;
const contentState = ContentState.createFromBlockArray(contentBlocks, entityMap);
return EditorState.createWithContent(contentState);
}
class EditorVan extends Component {
state = {
editorState: ''
}
onEditorStateChange = (editorState) => {
this.setState({
editorState
})
this.props.transformHTML( transformDraftStateToHtml(editorState) )
};
componentDidMount() {
this.setState({
editorState: transformHtmlToDraftState(this.props.editorState)
})
};
uploadImageCallBack = (file) => {
return new Promise((resolve, reject) => {
(async() => {
const base64 = await getBase64(file);
const data = {
base64: base64.split(',')[1],
fileName: file.name,
fileCode: 'material',
}
const res = await UploadBase64(data);
if(res && res.data) {
resolve({
data: {
link: `${IMG_URL}${res.data}`,
},
});
} else {
reject();
}
})();
})
}
render() {
return (
<Editor
editorState={this.state.editorState}
onEditorStateChange={this.onEditorStateChange}
toolbar={{
image: {
uploadCallback: this.uploadImageCallBack,
alt: { present: true, previewImage: true },
previewImage: true,
},
}}
/>
)
}
};
export default EditorVan;
function getBase64(img, callback) {
return new Promise((res, rej) => {
const reader = new FileReader();
reader.addEventListener('load', () => res(reader.result));
reader.readAsDataURL(img);
})
}
组件解析
React-draft-wysiwyg 中原生支持外部图片链接上传 ,使用中直接 粘贴一份图片的 url 即可
实际开发中, 需要上传本地图片 这里就需要 自己实现
该组件 import 中 UploadBase64 与 IMG_URL 正是用来处理本地图片上传、UploadBase64 为 图片上传接口 ,该接口 图片上传至后台后, 后台会返回一个 相对路径, 因为相对路径是没有办法在页面直接展示图片的, 于是这里我使用了 与后台 约定好的 host: IMG_URL 对图片路径进行拼接展示,这两部分, 大家可以在实际项目中自行进行增删处理, 特此说明
基于 React-draft-wysiwyg 实现的 react 富文本编辑器组件 开箱即用的更多相关文章
- Vue2 封装的 Quill 富文本编辑器组件 Vue-Quill-Editor
1.安装 npm install vue-quill-editor --save 2.使用 import { quillEditor } from 'vue-quill-editor' 3.组件中 & ...
- 富文本编辑器-SpringBoot
目录 简介 Editor.md 基础工程搭建 数据库设计 基础项目搭建 文章编辑整合(重点) 图片上传问题 表情包问题 文章展示 简介 项目地址:https://gitee.com/zwtgit/ri ...
- Java-Swing中使用Web富文本编辑器
资料下载 (截取出了邮件发送的功能.) 2018/11/10 因为要 win7 电脑 IE 8 的原因,使用了 jxBrower 拓展,更容易使用,参考链接(推荐) 问题介绍 window客户端软件的 ...
- 富文本编辑器Simditor
文档地址:https://simditor.tower.im/docs/doc-usage.html 父组件: options: { placeHolder: 'this is placeHolder ...
- vue富文本编辑器vue-quill-editor使用总结(包含图片上传,拖拽,放大和缩小)
vue-quill-editor是vue很好的富文本编辑器,富文本的功能基本上都支持,样式是黑白色,简洁大方. 第一步下载 vue-quill-editor: npm i vue-quill-edit ...
- 前端vue-TinyMCE富文本编辑器表情插件报错解决
最近项目中需要使用文本编辑器,比较了下最终选择了TinyMCE这款富文本编辑器.我安装的是TinyMCE v5但是在使用表情插件的时候,表情一直都出不来,报错信息如下: Uncaught Syntax ...
- 富文本编辑器TinyMCE的使用(React Vue)
富文本编辑器TinyMCE的使用(React Vue) 一,需求与介绍 1.1,需求 编辑新闻等富有个性化的文本 1.2,介绍 TinyMCE是一款易用.且功能强大的所见即所得的富文本编辑器. Tin ...
- 【重点突破】—— React实现富文本编辑器
前言:富文本编辑器Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器. 一.安装插件 react-draft-wysiwyg: 文本编辑器插件 dra ...
- react富文本编辑器
首先安装两个插件 yarn add react-draft-wysiwyg draftjs-to-html --save 使用的代码如下 import React from 'react' impor ...
随机推荐
- Android 特别大的Activity和Fragment的生命周期图
这么 这么大的图.不做太多解释,哈哈,真的是棒棒的. 代码測试下载:http://download.csdn.net/detail/pcaxb/8906085
- HTTP的上传文件实例分析
这个是http文件传输的一种格式,当时不知道这种格式,废弃. HTTP的上传文件实例分析 由于论坛不支持Word写文章发帖. 首先就是附件发送怎么搞,这个必须解决.论坛是php的.我用Chrome类浏 ...
- WebService:JAX-WS实现WebService
WebService和Java核心技术中的RMI一样用于实现异构平台上的应用程序之间数据的交互,唯一不同的是这样的技术屏蔽了语言之间的差异.这也是其大行其道的原因. 实现WebService的技术多种 ...
- vmware 自动挂起
用VMware跑虚拟机,经常会出现客户操作系统自己挂起的现象,怀疑是主机自己休眠的设置.设置之后,无效. 后来才发现不是主机休眠设置,还是应该设置客户操作系统中的休眠设置. 在客户机,控制面板 电源 ...
- bash的pushd和popd
1 pushd和popd是bash shell的builtin命令 2 pushd和popd维护了一个目录栈 pushd xxx就是将xxx放入目录栈顶. 目录栈顶就是当前的目录. 但是cd的话,会不 ...
- C语言文件读写Demo
CIODemo.c #include <stdio.h> #include <time.h> #define INPUT_BUFFER_SIZE 100 * 1024 int ...
- MySQL的简单优化
一.如何发现需要优化的SQL 主要使用MySQL的慢查日志对有效率问题的SQL进行监控 第一步:启动慢查日志的监控 打开开关,将未使用索引的查询记录到慢查日志中 设置查询时间,当查询时间大于这个值,就 ...
- Mac开发必备工具(二)—— iTerm 2
iTerm 2 简介 iTerm 2 is a terminal emulator for Mac OS X that does amazing things. iTerm 2 有很多能够提升效率的实 ...
- Kappa:比Lambda更好更灵活的实时处理架构
为了进一步探讨这种批处理和实时处理有效整合在同一系统的架构,我们将在今天的文章中分析Lambda三层结构模型的适用场景,同时暴露出Lambda架构一个最明显的问题:它需要维护两套分别跑在批处理和实时计 ...
- 自定义android 音乐通知栏 ——可伸缩扩展
Android custom notification for music player Example In this tutorial, you will learn how to creat ...