工作中遇到了一个需要做图文详情 的富文本编辑的需求,

于是基于 React-draft-wysiwyg 实现了一个 纯组件,

目前支持 常规文本输入 外部链接图片 以及本地上传图片,

由于是纯组件, 可直接放在react 项目中引入使用

具体项目中使用十分方便, 一行代码搞定,

<EditorVan editorState={this.state.editorState} transformHTML={(editorState) => this.setState({ editorState })} />

  上面代码中的 props.editorState 为对当前富文本编辑组件传入的值, 类型为字符串, 传入后 EditorVan 会自行对字符串进行解析,最终显示为 html 格式,

  props.transformHTML 是一个方法, 用户在进行富文本编辑时, 实时对父组件 进行更新, 返回的html格式字符, 可以直接传至后台, 不需要在父组件中额外处理, 如果需要在这个方法中执行其他操作, 例如进行form 表单校验等操作, 可以写在 setState回调函数中, 或者用一个父组件方法代替
 
 
以下是组件全部代码
使用前, 请确保各个包都有安装好:
 
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 对图片路径进行拼接展示,这两部分, 大家可以在实际项目中自行进行增删处理, 特此说明

  

  transformDraftStateToHtml 该方法是对传入的 字符串 解析成 html
  

  transformHtmlToDraftState 用于编辑修改后 将当前编辑框中的内容 转换成 字符串 , 传入父组件 以供与后台接口使用
  
  整个组件大致如此, 基本上满足了日常需要, 如果哪里不清楚 请在下方留言 或直接查阅官方文档

基于 React-draft-wysiwyg 实现的 react 富文本编辑器组件 开箱即用的更多相关文章

  1. Vue2 封装的 Quill 富文本编辑器组件 Vue-Quill-Editor

    1.安装 npm install vue-quill-editor --save 2.使用 import { quillEditor } from 'vue-quill-editor' 3.组件中 & ...

  2. 富文本编辑器-SpringBoot

    目录 简介 Editor.md 基础工程搭建 数据库设计 基础项目搭建 文章编辑整合(重点) 图片上传问题 表情包问题 文章展示 简介 项目地址:https://gitee.com/zwtgit/ri ...

  3. Java-Swing中使用Web富文本编辑器

    资料下载 (截取出了邮件发送的功能.) 2018/11/10 因为要 win7 电脑 IE 8 的原因,使用了 jxBrower 拓展,更容易使用,参考链接(推荐) 问题介绍 window客户端软件的 ...

  4. 富文本编辑器Simditor

    文档地址:https://simditor.tower.im/docs/doc-usage.html 父组件: options: { placeHolder: 'this is placeHolder ...

  5. vue富文本编辑器vue-quill-editor使用总结(包含图片上传,拖拽,放大和缩小)

    vue-quill-editor是vue很好的富文本编辑器,富文本的功能基本上都支持,样式是黑白色,简洁大方. 第一步下载 vue-quill-editor: npm i vue-quill-edit ...

  6. 前端vue-TinyMCE富文本编辑器表情插件报错解决

    最近项目中需要使用文本编辑器,比较了下最终选择了TinyMCE这款富文本编辑器.我安装的是TinyMCE v5但是在使用表情插件的时候,表情一直都出不来,报错信息如下: Uncaught Syntax ...

  7. 富文本编辑器TinyMCE的使用(React Vue)

    富文本编辑器TinyMCE的使用(React Vue) 一,需求与介绍 1.1,需求 编辑新闻等富有个性化的文本 1.2,介绍 TinyMCE是一款易用.且功能强大的所见即所得的富文本编辑器. Tin ...

  8. 【重点突破】—— React实现富文本编辑器

    前言:富文本编辑器Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器.   一.安装插件 react-draft-wysiwyg: 文本编辑器插件 dra ...

  9. react富文本编辑器

    首先安装两个插件 yarn add react-draft-wysiwyg draftjs-to-html --save 使用的代码如下 import React from 'react' impor ...

随机推荐

  1. mvc5新特性RouteAttribute特征路由

    mvc5新特性RouteAttribute特征路由,本文讲述如何开启mvc5的RouteAttribute路由功能并附上一个实例说明RouteAttribute是怎么工作的 mvc5新特性RouteA ...

  2. appium支持的版本

    appium 支持4.2以上的版本 2.3-4.1的版本的支持通过Selendroid实现

  3. POJ 1183 反正切函数的应用(数学代换,基本不等式)

    题目链接:http://poj.org/problem?id=1183 这道题关键在于数学式子的推导,由题目有1/a=(1/b+1/c)/(1-1/(b*c))---------->a=(b*c ...

  4. Android — 长按ListView 利用上下文菜单(ActionMode) 进行批量事件处理

    好久没写博客拉``````` 近期最终略微闲一点了``````` 无聊拿手机清理短信.发现批量事件的处理还是挺管用的`````` 那么自己也来山寨一记看看效果吧````` 闲话少说,首先,我们来看下手 ...

  5. iptables apache2

    Apache2 iptables 安装指令:sudo apt-get install apache2 2.产生的启动和停止文件是:/etc/init.d/apache2 3.启动:sudo apach ...

  6. reviews of learn python3 the hard way

    Almost every time,I try my best to write a long review of the book I have read. But this time I want ...

  7. Android Studio解决导入项目非常慢

    Android Studio比Eclipse ADT有巨大的优势.Android Studio原生支持使用Gradle来构建项目,使用动态语言Groovy定义项目构建的过程,避免了build.xml文 ...

  8. java.lang.IllegalStateException: No instances available for localhost

    在SpringCloud的项目中,我们使用了自动配置的OAuth2RestTemplate,RestTemplate,但是在使用这些restTemplate的时候,url必须是服务的名称,如果要调用真 ...

  9. Docker安装 人生第一次

    Ubuntu 系列安装 Docker 通过系统自带包安装 Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装. $ sudo apt-get update $ sudo a ...

  10. damon

    不管是否有-f参数,最终程序都会进入 fuse_loop_mt 循环中,在helper.c的fuse_main_common函数中. 1. 有-f参数.这种情况下fuse_setup_common函数 ...