基于 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 ...
随机推荐
- mysql (primary key)_(unique key)_(index) difference
MYSQL index MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找 ...
- Android GUI系统学习1:Gralloc
Gralloc模块是从Android Eclair(android 2.1)開始增加的一个HAL模块,Gralloc的含义为是Graphics Alloc(图形分配).他对上为libui提供服务,为其 ...
- Java 复杂excel报表导出
MyExcel,是一个可直接使用Html文件,或者使用内置的Freemarker.Groovy.Beetl等模板引擎Excel构建器生成的Html文件,以Html文件中的Table作为Excel模板来 ...
- top load average
负载均值 等待运行的进程数
- 如何去除Office Excel的密码保护?
企图更改Excel文件内容,然而却弹出如下提示: 根据提示,我尝试解除保护表,却要求输入密码: 这就尴尬了=_=密码不是我设定的 问了度娘,找到了解决方案 将Excel文件扩展名更改为rar, 使用压 ...
- 简说 call() 、apply() 、bind()
对于这三个方法,我想一部分人还是比较陌生的. 所以今天来个简单的介绍~ 我们可以将call()和apply()看作是某个对象的方法,通过调用方法的形式来间接调用函数.call()和apply()的第一 ...
- gradle配置
一.你不想看到的 Gradle Build Running 话说在天朝当程序员也是很不容易的,不管是查阅资料还是下载东西,很多时候你会发现自己上网姿势不对,当然对大多数程序员来说,这都不是事儿.这次重 ...
- 详解likely和unlikely函数【转】
本文转载自:http://blog.csdn.net/npy_lp/article/details/7175517 内核源码:Linux-2.6.38.8.tar.bz2 参考文档:http://gc ...
- BestCoder4 1002 Miaomiao's Geometry (hdu 4932) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4932 题目意思:给出 n 个点你,需要找出最长的线段来覆盖所有的点.这个最长线段需要满足两个条件:(1 ...
- codeforces 440B. Balancer 解题报告
题目链接:http://codeforces.com/problemset/problem/440/B 题目意思:给出 n 个数,求出这 n 个数的平均值avg,问对于这 n 个数里面中的每一个数,要 ...