react引入富文本编辑器TinyMCE

这周做了一个PC端的service后台需求,要求有富文本编辑器,插入图片、表格,字体字号背景色等等,

最后引入了富文本编辑器TinyMCE

对于TinyMCE的简介:

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。

TinyMCE的优势:

  • 开源可商用,基于LGPL2.1
  • 插件丰富,自带插件基本涵盖日常所需功能
  • 接口丰富,可扩展性强,有能力可以无限拓展功能
  • 界面好看,符合现代审美
  • 提供经典、内联、沉浸无干扰三种模式
  • 对标准支持优秀(自v5开始)
  • 多语言支持,官网可下载几十种语言。

上图为需求中配置的富文本编辑器的内容,我的需求TinyMCE完全可以满足,

TinyMCE 官网:www.tiny.cloud

TinyMCE支持vue、react、angular

这次改动的工程使用的是react,

在需求中封装了一个适合我们的富文本编辑组件:

editor组件中的内容:

import React from ‘react‘;
import ‘./Editor.scss‘;

import {isDev, nginxPrefix} from ‘@/config‘;

import {Upload, Button, Icon, Popconfirm, Spin, message} from ‘antd‘;

import _get from ‘lodash/get‘;
import _uniqueId from ‘lodash/uniqueId‘;

import PropTypes from ‘prop-types‘;

/*
* @props string id? 标识符
* @props number height? 高度
* @props string defaultContent? 初始内容
* @props boolen disabled? 禁用
* @props function onDelete? 删除事件
* @props function onAdd? 添加事件
* @props object uploadConfig? 自定义上传配置
* @event function getEditorContent 获取编辑内容
* @event function setEditorContent 设置编辑内容
* @event function insertContent 插入编辑内容
*/
class Editor extends React.Component {
    constructor(props) {
        super(props);

        const tinymceId = `editor-tinymce-${this.props.id}-${_uniqueId()}-${new Date().getTime()}`;

        this.state = {
            // 编辑器ID
            tinymceId,
            // 编辑器实例
            editor: null
        };
    }

    componentDidMount() {
        const {height = 300, defaultContent = ‘‘} = this.props;
        window.tinymce.init({
            selector: `#${this.state.tinymceId}`,
            language: ‘zh_CN‘,
            height: height,
            min_height: 200,
            width: ‘100%‘,
            resize: true,
            default_link_target: ‘_blank‘,
            init_instance_callback: editor => {
                if (defaultContent) {
                    editor.setContent(defaultContent);
                }
            },
            paste_enable_default_filters: true,
            // paste_word_valid_elements: () => {
            //
            // },
            // 插件配置
            plugins: ‘table image lists link paste‘,
            // 菜单配置
            menubar: ‘file edit view insert format‘,
            // 工具栏配置
            /* eslint-disable */
            toolbar: ‘undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | outdent indent | blockquote | table | image link | forecolor backcolor | bullist numlist | removeformat‘
            /* eslint-enable */
        }).then(([editor]) => this.setState({editor}));
    }

    componentWillUnmount() {
        // 在某些生命周期中,实例并未生成,没有卸载方法。(组件挂载阶段)
        // if (this.state.editor !== null) {
        //     this.state.editor.destroy();
        // }
        window.tinymce.get(this.state.tinymceId).destroy();
    }

    getEditorContent = () => {
        return this.state.editor.getContent();
    }

    setEditorContent = (content) => {
        window.tinymce.get(this.state.tinymceId).setContent(content);
    }

    insertContent = (content) => {
        try {
            this.state.editor.insertContent(content);
        } catch(e) {
            window.tinymce.get(this.state.tinymceId).insertContent(content);
        }
    }

    // 默认上传配置
    uploadConfig = {
        name: ‘file‘,
        action: (isDev ? ‘‘ : nginxPrefix) + ‘/admin/common/uploadFile‘,
        headers: {
            authorization: ‘authorization-text‘,
        },
        onChange: (info) => {
            if (info.file.status === ‘done‘) {
                message.success(‘图片上传成功‘);
                this.state.editor.insertContent(
                    `<img src="${_get(info, ‘file.response.data.result‘)}" >`
                );
            } else if (info.file.status === ‘error‘) {
                message.error(‘图片上传失败‘);
            }
        },
        accept: ‘.jpg,.jpeg,.jpe,.png,.bmp‘
    }

    render() {
        const {uploadConfig} = this.props;
        return (
            <Spin spinning={this.props.disabled} indicator={<Icon type="stop" style={{color: ‘#555‘}} />}>
                <div className="editor-container">
                    <textarea id={this.state.tinymceId} />
                    <div className="btn-bar">
                        <Upload {...(uploadConfig ? uploadConfig : this.uploadConfig)}>
                            <Button><Icon type="upload" />添加本地图片</Button>
                        </Upload>
                        <span>
                            {
                                this.props.onAdd
                                &&
                                <Button icon="plus" shape="circle" onClick={this.props.onAdd} />
                            }
                            {
                                this.props.onDelete
                                &&
                                <Popconfirm
                                    title="无法撤回,确认删除?"
                                    onConfirm={this.props.onDelete}
                                    okText="确认"
                                    cancelText="取消"
                                    placement="leftBottom"
                                >
                                    <Button
                                        type="danger"
                                        icon="delete"
                                        shape="circle"
                                        style={{marginLeft: ‘4px‘}}
                                        onClick={() => {
                                            // 当富文本编辑器中没有内容时,删除按钮不弹窗,直接调用删除方法
                                            const content = this.getEditorContent();

                                            if (!content) {
                                                this.props.onDelete();
                                            }
                                        }}
                                    />
                                </Popconfirm>
                            }
                        </span>
                    </div>
                </div>
            </Spin>
        );
    }
}

Editor.defaultProps = {
    id: ‘no-props-id‘,
    height: 300,
    defaultContent: ‘‘,
    onDelete: null,
    onAdd: null,
    disabled: false,
    uploadConfig: null
};

Editor.propTypes = {
    id: PropTypes.string,
    height: PropTypes.number,
    defaultContent: PropTypes.string,
    onDelete: PropTypes.func,
    onAdd: PropTypes.func,
    disabled: PropTypes.bool
};

export default Editor;

组件最终提交的是一段HTML,图片只是一个URL,大小非常小,非常实用

这次的需求中富文本编辑框是录入案例,

当然有录入就有展示,对于展示也很简单,在展示的地方加了个图片放大的功能

展示的时候有个问题,就是图片的大小我们想控制的很小,这样整体的内容都可以看到,图片具体内容可以点击图片放大,

来来来,展示一下我男神图片点击放大之后的帅图:

原文地址:https://www.cnblogs.com/katydids/p/12676111.html

时间: 2024-10-11 11:35:26

react引入富文本编辑器TinyMCE的相关文章

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

富文本编辑器TinyMCE的使用(React Vue) 一,需求与介绍 1.1,需求 编辑新闻等富有个性化的文本 1.2,介绍 TinyMCE是一款易用.且功能强大的所见即所得的富文本编辑器. TinyMCE的优势: 开源可商用,基于LGPL2.1 插件丰富,自带插件基本涵盖日常所需功能 接口丰富,可扩展性强,有能力可以无限拓展功能 界面好看,符合现代审美 提供经典.内联.沉浸无干扰三种模式 对标准支持优秀(自v5开始) 多语言支持,官网可下载几十种语言. 二,配置集成并组件化 2.1,通用配置

django后台集成富文本编辑器Tinymce的使用

富文本编辑器Tinymce是使用步骤: 1.首先去python的模块包的网站下载一个django-tinymce的包 2.下载上图的安装包,然后解压,进入文件夹,执行: (pychrm直接运行命令pip install django_tinymce直接下载安装) 安装完成之后,就可以在C:\python3.6\Lib\site-packages这个文件夹. 点击进入文件夹,copy"tinymce"这个文件到你的项目的根目录下. 3.配置tinycmce到你的项目中,配置到admin数

【React】富文本编辑器 清空文本内容 获取HTML

富文本编辑器  React  传入 import React,{Component } from 'react'; import { Card, Button, Table, Form, Select,Modal, message } from 'antd'; import { Wrap } from './style'; // 富文本的 内容数据值 import { EditorState } from 'draft-js'; // 组件化标签 import { Editor } from '

Java开发之富文本编辑器TinyMCE

一.题外话 最近负责了一个cms网站的运维,里面存在很多和编辑器有关的问题,比如编辑一些新闻博客,论文模块.系统采用的是FCKEditor,自我感觉不是很好,如下图 特别是在用户想插入一个图片的话,就很麻烦,所有用户共享一个文件目录,这样就不好了,于是便想到了TinyMCE编辑器,博客园默认的也是这个编辑器,接下 来,我们开始吧 二.TinyMCE编辑器集成步骤 2.1:下载相关文件 (1)下载TinyMCE插件包 下载地址:   https://www.tinymce.com/download

在vue cli 3脚手架里引入tinymce 5富文本编辑器

本文主要讲的是在Vue cli 3脚手架搭建的项目里如何引用Tinymce 5富文本编辑器. 请注意识别"版本号",不同版本的配置细节有所不同. 1. tinymce的安装 1. 安装tinymce-vue npm install @tinymce/tinymce-vue -S 2. 安装tinymce npm install tinymce -S 3. 下载中文语言包 tinymce提供的语言包很多,选择下载中文语言包 2. 使用方法 1. 文件操作 在项目根目录的public目录下

在vue中使用tinymce富文本编辑器,解决tinymce在dialog对话框中层级太低的问题

1.安装 npm install tinymce -S 2.把node_modules\tinymce里面的文件 包括tinymce文件夹 全部复制到static文件夹下面,如下图 3.tinymce默认是英文界面,还需要下载一个中文语言包zh_CN.js https://www.tiny.cloud/get-tiny/language-packages/ 在tinymce文件夹下新建langs文件夹,将下载好的语言包放到langs文件夹下面如图  4.在main.js中引入tinymce  5

tinymce 富文本编辑器 编写资料

tinymce官方文档: 粘贴图片插件 博客搬运地址 使用Blob获取图片并二进制显示实例页面 tinymce自动调整插件 是时候掌握一个富文本编辑器了——TinyMCE(1) XMLHttpRequest 2.0的家臣们 URL.createObjectURL和URL.revokeObjectURL 如何使用 blob:http:// 隐藏一个mp3文件的真实地址? https://www.z-u-i-d-a-i-m-a.com/question/3913274460982272.htm 使用

vue项目富文本编辑器vue-quill-editor之自定义图片上传

使用富文本编辑器的第一步肯定是先安装依赖 npm i vue-quill-editor 1.如果按照官网富文本编辑器中的图片上传是将图片转为base64格式的,如果需要上传图片到自己的服务器,需要修改配置. 创建一个quill-config.js的文件,里面写自定义图片上传.代码如下 /*富文本编辑图片上传配置*/ const uploadConfig = { action: '', // 必填参数 图片上传地址 methods: 'POST', // 必填参数 图片上传方式 token: ''

各大富文本编辑器对比

各大WYSIWYG编辑器的简单比较 TinyMCE强大的富文本编辑器,支持拖拽.粘贴上传图片,支持拖拽表格.博客园用的就是这个编辑器. 参考博客:1.   https://segmentfault.com/a/1190000012791569#articleHeader8   vue项目移植tinymce踩坑 2. https://blog.csdn.net/haoxiaoyong1014/article/details/82683428   Vue 自定义富文本编辑器 tinymce 支持导入