react集成tinymce富文本编辑器

tinymce富文本编辑器

官方文档:https://www.tiny.cloud/docs/quick-start/

中文文档:http://tinymce.ax-z.cn/

支持vue、react、angular

react集成

命令

shell 复制代码
yarn add @tinymce/tinymce-react
yarn add tinymce

代码

js 复制代码
import { useState, useEffect } from 'react'
import { Editor } from '@tinymce/tinymce-react'
import 'tinymce/tinymce'
import 'tinymce/models/dom'
import 'tinymce/icons/default'
import 'tinymce/themes/silver/theme'
// Skins
import './index.less'

// Plugins 组件根据init中调用情况自行加载
import 'tinymce/plugins/accordion'
import 'tinymce/plugins/charmap'
import 'tinymce/plugins/help'
import 'tinymce/plugins/media'
import 'tinymce/plugins/searchreplace'
import 'tinymce/plugins/advlist'
import 'tinymce/plugins/code'
import 'tinymce/plugins/image'
import 'tinymce/plugins/nonbreaking'
import 'tinymce/plugins/table'
import 'tinymce/plugins/anchor'
import 'tinymce/plugins/codesample'
import 'tinymce/plugins/importcss'
import 'tinymce/plugins/pagebreak'
import 'tinymce/plugins/template'
import 'tinymce/plugins/autolink'
import 'tinymce/plugins/directionality'
import 'tinymce/plugins/insertdatetime'
import 'tinymce/plugins/preview'
import 'tinymce/plugins/visualblocks'
import 'tinymce/plugins/autoresize'
import 'tinymce/plugins/emoticons'
import 'tinymce/plugins/link'
import 'tinymce/plugins/quickbars'
import 'tinymce/plugins/visualchars'
import 'tinymce/plugins/autosave'
import 'tinymce/plugins/fullscreen'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/save'
import 'tinymce/plugins/wordcount'

import './langs/zh-Hans'

export default function RichEditor({ value, onChange }) {
  const [showEditor, setShowEditor] = useState(true)
  useEffect(() => {
    setShowEditor(false)
    setShowEditor(true)
  }, [value])
  const onEditorChange = (e) => {
    console.log(e)
    onChange(e)
  }
  const imagesUploadHandler = (blobInfo, progress) =>
    new Promise((resolve, reject) => {
      console.log(blobInfo, progress)
      resolve('1.jpg')
    })
  const config = {
    skin: false,
    content_css: false,
    height: 500,
    plugins: [
      'advlist',
      'anchor',
      'autolink',
      'help',
      'image',
      'link',
      'lists',
      'searchreplace',
      'table',
      'wordcount',
      'charmap',
      'preview',
      'anchor',
      'visualblocks',
      'code',
      'fullscreen',
      'insertdatetime',
      'media',
      'code',
      'codesample',
    ],
    toolbar:
      'undo redo | formatselect | bold italic backcolor |  alignleft aligncenter alignright alignjustify |bullist numlist outdent indent | removeformat |image|codesample|code|preview|fullscreen | help',
    menu: {
      file: { title: '文件', items: 'newdocument restoredraft | preview | print ' },
      edit: { title: 'Edit', items: 'undo redo | cut copy paste | selectall | searchreplace' },
      view: {
        title: 'View',
        items: 'code | visualaid visualchars visualblocks | spellchecker | preview fullscreen',
      },
      insert: {
        title: 'Insert',
        items:
          'image link media template codesample inserttable | charmap emoticons hr | pagebreak nonbreaking anchor toc | insertdatetime',
      },
      format: {
        title: 'Format',
        items:
          'bold italic underline strikethrough superscript subscript codeformat | formats blockformats fontformats fontsizes align | forecolor backcolor | removeformat',
      },
      tools: { title: 'Tools', items: 'spellchecker spellcheckerlanguage | code wordcount' },
      table: { title: 'Table', items: 'inserttable | cell row column | tableprops deletetable' },
      favs: {
        title: 'My Favorites',
        items: 'code visualaid | searchreplace | spellchecker | emoticons',
      },
    },
    menubar: 'file edit view insert format tools table favs',
    codesample_languages: [
      { text: 'HTML/XML', value: 'markup' },
      { text: 'JavaScript', value: 'javascript' },
      { text: 'CSS', value: 'css' },
      { text: 'PHP', value: 'php' },
      { text: 'Ruby', value: 'ruby' },
      { text: 'Python', value: 'python' },
      { text: 'Java', value: 'java' },
      { text: 'C', value: 'c' },
      { text: 'C#', value: 'csharp' },
      { text: 'C++', value: 'cpp' },
      { text: 'Scala', value: 'scala' },
    ],
    promotion: false, //阻止更新提示
    language: 'zh-Hans',
    image_uploadtab: true,
    images_upload_handler: imagesUploadHandler,
  }
  return (
    <>
      {showEditor && (
        <Editor
          initialValue={value}
          init={config}
          // tinymceScriptSrc="./1/tinymce.min.js"
          onEditorChange={onEditorChange}
        />
      )}
    </>
  )
}

样式文件

css 复制代码
index.less
@import '~tinymce/skins/ui/oxide/skin.min.css';
@import '~tinymce/skins/ui/oxide/content.inline.min.css';

.tox-statusbar__branding {
  display: none;
}

使用组件

js 复制代码
import { debounce } from 'lodash'

  const onChange = debounce((value) => {
    record.illustrate = value
    save(record)
  }, 1000)

<RichEditor value={record.illustrate} onChange={onChange} />
相关推荐
三思而后行,慎承诺12 分钟前
Reactnative实现远程热更新的原理是什么
javascript·react native·react.js
知识分享小能手15 分钟前
React学习教程,从入门到精通,React 组件生命周期详解(适用于 React 16.3+,推荐函数组件 + Hooks)(17)
前端·javascript·vue.js·学习·react.js·前端框架·vue3
面向星辰24 分钟前
html音视频和超链接标签,颜色标签
前端·html·音视频
lxh011326 分钟前
LRU 缓存
开发语言·前端·javascript
yangzhi_emo1 小时前
ES6笔记5
前端·笔记·es6
wow_DG1 小时前
【Vue2 ✨】Vue2 入门之旅 · 进阶篇(二):虚拟 DOM 与 Diff 算法
开发语言·javascript·vue.js·算法·前端框架
Hexene...2 小时前
【前端Vue】el-dialog关闭后黑色遮罩依然存在如何解决?
前端·javascript·vue.js·elementui·前端框架
Jay_See2 小时前
JC链客云——项目过程中获得的知识、遇到的问题及解决
前端·javascript·vue.js
普通码农2 小时前
Element Plus 数字输入框箭头隐藏方案
前端