希望未来 發表於 2019-5-14 11:28:00

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

<h1 style="text-align: center">富文本编辑器TinyMCE的使用(React Vue)</h1>
<h2>一,需求与介绍</h2>
<h3>&nbsp;1.1,需求</h3>
<p>&nbsp; &nbsp; &nbsp;编辑新闻等富有个性化的文本</p>
<h3>&nbsp;1.2,介绍</h3>
<p>TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。</p>
<p>TinyMCE的优势:</p>
<ul>
<li>开源可商用,基于LGPL2.1</li>
<li>插件丰富,自带插件基本涵盖日常所需功能</li>
<li>接口丰富,可扩展性强,有能力可以无限拓展功能</li>
<li>界面好看,符合现代审美</li>
<li>提供经典、内联、沉浸无干扰三种模式</li>
<li>对标准支持优秀(自v5开始)</li>
<li>多语言支持,官网可下载几十种语言。</li>
</ul>
<h2>二,配置集成并组件化</h2>
<h3>2.1,通用配置</h3>
<p>1,工具栏toolbar</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Here is a list of the toolbar</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols</span>
<span style="color: rgba(0, 128, 128, 1)">3</span>
<span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indentblockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor']// fullscreen</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> const toolbar = ['code codesample undo redo restoredraft | cut copy paste pastetext | forecolor backcolor searchreplace bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | bullist numlist | formatselect fontselect fontsizeselect | blockquote subscript superscript removeformat | table image media charmap emoticons hr pagebreak insertdatetime print preview']<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> | fullscreen</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> toolbar</pre>
</div>
<p>2,插件plugins</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Any plugins you want to use has to be imported</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Detail plugins list see https://www.tinymce.com/docs/plugins/</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Custom builds see https://www.tinymce.com/download/custom-builds/</span>
<span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> const plugins = ['advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount']</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> const plugins = ['print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help paste emoticons autosave'<span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">7</span>
<span style="color: rgba(0, 128, 128, 1)">8</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> plugins</pre>
</div>
<p>3,常用字体配置fonts</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Any font you want to use has to be imported</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> const fontsizeFormats='12px 14px 16px 18px 24px 36px 48px 56px 72px'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">3</span> const fontFormats= '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats;知乎配置=BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif;小米配置=Helvetica Neue,Helvetica,Arial,Microsoft Yahei,Hiragino Sans GB,Heiti SC,WenQuanYi Micro Hei,sans-serif'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 0, 1)">    fontsizeFormats,
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">    fontFormats
</span><span style="color: rgba(0, 128, 128, 1)">8</span> }</pre>
</div>
<p>4,准备标签</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">2</span>               <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">textarea </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="tinymceId"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">3</span>             <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>在textarea外面需要套一层div,否则会产生一些意想不到的问题</p>
<p>5,初始化标签,生成编辑框</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)"> window.tinymce.init({
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>       language: 'zh_CN'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">      selector: `#${tinymceId}`,
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">      height: height,
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>       body_class: 'panel-body '<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>       object_resizing: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>       toolbar: toolbar.length &gt; 0 ?<span style="color: rgba(0, 0, 0, 1)"> toolbar : defaultToolbar,
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">      menubar: menubar,
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">      plugins: defaultplugins,
</span><span style="color: rgba(0, 128, 128, 1)">10</span>       end_container_on_empty_block: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">      fontsize_formats: fontsizeFormats,
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">      font_formats: fontFormats,
</span><span style="color: rgba(0, 128, 128, 1)">13</span>       powerpaste_word_import: 'clean'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">14</span>       code_dialog_height: 450<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">15</span>       code_dialog_width: 1000<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">16</span>       advlist_bullet_styles: 'square'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">17</span>       advlist_number_styles: 'default'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">18</span>       imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'<span style="color: rgba(0, 0, 0, 1)">],
</span><span style="color: rgba(0, 128, 128, 1)">19</span>       default_link_target: '_blank'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">20</span>       link_title: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">21</span>       nonbreaking_force_tab: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> inserting nonbreaking space &amp;nbsp; need Nonbreaking Space Plugin</span>
<span style="color: rgba(0, 128, 128, 1)">22</span>       init_instance_callback: editor =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">23</span>         <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (content) {
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">          editor.setContent(content)
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">26</span>         editor.on('NodeChange Change KeyUp SetContent', () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)">      },
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)">      setup(editor) {
</span><span style="color: rgba(0, 128, 128, 1)">30</span>         editor.on('FullscreenStateChanged', (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">33</span>   })</pre>
</div>
<h3>2.2,React组件化</h3>
<p>&nbsp;直接放代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">2</span> import { Button } from 'antd'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">3</span> import PropTypes from 'prop-types'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> import styles from './index.less'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">6</span> import defaultplugins from './plugins'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">7</span> import defaultToolbar from './toolbar'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">import {
</span><span style="color: rgba(0, 128, 128, 1)">9</span> <span style="color: rgba(0, 0, 0, 1)">fontsizeFormats,
</span><span style="color: rgba(0, 128, 128, 1)"> 10</span> <span style="color: rgba(0, 0, 0, 1)">fontFormats
</span><span style="color: rgba(0, 128, 128, 1)"> 11</span> } from './font'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 12</span> import UploadImage from './UploadImage'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 13</span>
<span style="color: rgba(0, 128, 128, 1)"> 14</span>
<span style="color: rgba(0, 128, 128, 1)"> 15</span> <span style="color: rgba(0, 0, 0, 1)">class Tinymce extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 16</span>
<span style="color: rgba(0, 128, 128, 1)"> 17</span>   static propTypes =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 18</span> <span style="color: rgba(0, 0, 0, 1)">    tinymceId: PropTypes.string,
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span> <span style="color: rgba(0, 0, 0, 1)">    content: PropTypes.string,
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span> <span style="color: rgba(0, 0, 0, 1)">    toolbar: PropTypes.array,
</span><span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(0, 0, 0, 1)">    menubar: PropTypes.string,
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(0, 0, 0, 1)">    height: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">    getContent: PropTypes.func,
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span>   static defaultProps =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 26</span>   tinymceId: 'react-tinymce-' + +<span style="color: rgba(0, 0, 255, 1)">new</span> Date() + ((Math.random() * 1000).toFixed(0) + ''<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>   menubar: 'file edit insert view format table'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span>   height: 520<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span> <span style="color: rgba(0, 0, 0, 1)">    toolbar: []
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span> <span style="color: rgba(0, 0, 0, 1)">constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">    super(props);
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span>   <span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span>       hasChange: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span>       hasInit: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span>       fullscreen: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">    };
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span>
<span style="color: rgba(0, 128, 128, 1)"> 40</span> <span style="color: rgba(0, 0, 0, 1)">componentDidMount() {
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initTinymce()
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span>
<span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span> <span style="color: rgba(0, 0, 0, 1)">componentWillUnmount() {
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.destroyTinymce()
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span> <span style="color: rgba(0, 0, 0, 1)">initTinymce() {
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span>   const { tinymceId, menubar, height, toolbar, content, getContent } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span>   const _this = <span style="color: rgba(0, 0, 255, 1)">this</span>
<span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">    window.tinymce.init({
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span>       language: 'zh_CN'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span> <span style="color: rgba(0, 0, 0, 1)">      selector: `#${tinymceId}`,
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span> <span style="color: rgba(0, 0, 0, 1)">      height: height,
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span>       body_class: 'panel-body '<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span>       object_resizing: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span>       toolbar: toolbar.length &gt; 0 ?<span style="color: rgba(0, 0, 0, 1)"> toolbar : defaultToolbar,
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span> <span style="color: rgba(0, 0, 0, 1)">      menubar: menubar,
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span> <span style="color: rgba(0, 0, 0, 1)">      plugins: defaultplugins,
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span>       end_container_on_empty_block: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span> <span style="color: rgba(0, 0, 0, 1)">      fontsize_formats: fontsizeFormats,
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span> <span style="color: rgba(0, 0, 0, 1)">      font_formats: fontFormats,
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span>       powerpaste_word_import: 'clean'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span>       code_dialog_height: 450<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span>       code_dialog_width: 1000<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span>       advlist_bullet_styles: 'square'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span>       advlist_number_styles: 'default'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span>       imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'<span style="color: rgba(0, 0, 0, 1)">],
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>       default_link_target: '_blank'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>       link_title: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span>       nonbreaking_force_tab: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> inserting nonbreaking space &amp;nbsp; need Nonbreaking Space Plugin</span>
<span style="color: rgba(0, 128, 128, 1)"> 71</span>       init_instance_callback: editor =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span>         <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (content) {
</span><span style="color: rgba(0, 128, 128, 1)"> 73</span> <span style="color: rgba(0, 0, 0, 1)">          editor.setContent(content)
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 0, 1)">      _this.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span>         hasInit: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)"> 77</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span>         editor.on('NodeChange Change KeyUp SetContent', () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span> <span style="color: rgba(0, 0, 0, 1)">          _this.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span>             hasChange: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)"> 81</span> <span style="color: rgba(0, 0, 0, 1)">          })
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span> <span style="color: rgba(0, 0, 0, 1)">      },
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(0, 0, 0, 1)">      setup(editor) {
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span>         editor.on('FullscreenStateChanged', (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">          _this.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span> <span style="color: rgba(0, 0, 0, 1)">            fullscreen: e.state
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span> <span style="color: rgba(0, 0, 0, 1)">          })
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span> <span style="color: rgba(0, 0, 0, 1)">    })
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span> <span style="color: rgba(0, 0, 0, 1)">destroyTinymce() {
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>   const { tinymceId } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>   const { fullscreen } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span>   const tinymce =<span style="color: rgba(0, 0, 0, 1)"> window.tinymce.get(tinymceId)
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span>   <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (fullscreen) {
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>       tinymce.execCommand('mceFullScreen'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">100</span>
<span style="color: rgba(0, 128, 128, 1)">101</span>   <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (tinymce) {
</span><span style="color: rgba(0, 128, 128, 1)">102</span> <span style="color: rgba(0, 0, 0, 1)">      tinymce.destroy()
</span><span style="color: rgba(0, 128, 128, 1)">103</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">104</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">105</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> setContent(value) {</span>
<span style="color: rgba(0, 128, 128, 1)">106</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   const { tinymceId } = this.props</span>
<span style="color: rgba(0, 128, 128, 1)">107</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   window.tinymce.get(tinymceId).setContent(value)</span>
<span style="color: rgba(0, 128, 128, 1)">108</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> }</span>
<span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 0, 1)">saveToGetContent() {
</span><span style="color: rgba(0, 128, 128, 1)">110</span>   const { tinymceId, getContent } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props
</span><span style="color: rgba(0, 128, 128, 1)">111</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (getContent &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">typeof</span> getContent === 'function'<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">112</span> <span style="color: rgba(0, 0, 0, 1)">      getContent(window.tinymce.get(tinymceId).getContent())
</span><span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">115</span>
<span style="color: rgba(0, 128, 128, 1)">116</span>   <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
</span><span style="color: rgba(0, 128, 128, 1)">117</span> <span style="color: rgba(0, 128, 0, 1)">   * 上传图片成功回调
</span><span style="color: rgba(0, 128, 128, 1)">118</span> <span style="color: rgba(0, 128, 0, 1)">   *</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)">119</span> <span style="color: rgba(0, 0, 0, 1)">imageSuccessCBK(arr) {
</span><span style="color: rgba(0, 128, 128, 1)">120</span>   const { tinymceId } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props
</span><span style="color: rgba(0, 128, 128, 1)">121</span>   arr.forEach(v =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">122</span>       window.tinymce.get(tinymceId).insertContent(`&lt;img class="wscnph" src="${v.url}" &gt;<span style="color: rgba(0, 0, 0, 1)">`)
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">    })
</span><span style="color: rgba(0, 128, 128, 1)">124</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">125</span> <span style="color: rgba(0, 0, 0, 1)">render() {
</span><span style="color: rgba(0, 128, 128, 1)">126</span>   const { loading, tinymceId } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props
</span><span style="color: rgba(0, 128, 128, 1)">127</span>   const { fullscreen } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state
</span><span style="color: rgba(0, 128, 128, 1)">128</span>   const header =<span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">129</span>       &lt;Page.Header breadcrumb={['富文本实例']} title={'富文本实例'} /&gt;
<span style="color: rgba(0, 128, 128, 1)">130</span> <span style="color: rgba(0, 0, 0, 1)">    );
</span><span style="color: rgba(0, 128, 128, 1)">131</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">132</span>       &lt;div className={styles['tinymce-components']}&gt;
<span style="color: rgba(0, 128, 128, 1)">133</span>         &lt;Page header={header} loading={!!loading}&gt;
<span style="color: rgba(0, 128, 128, 1)">134</span>
<span style="color: rgba(0, 128, 128, 1)">135</span>         &lt;div className={fullscreen ? "tinymce-container mce-fullscreen" : "tinymce-container"}&gt;
<span style="color: rgba(0, 128, 128, 1)">136</span>
<span style="color: rgba(0, 128, 128, 1)">137</span>             &lt;div&gt;
<span style="color: rgba(0, 128, 128, 1)">138</span>               &lt;textarea id={tinymceId} className={styles['tinymce-textarea']} /&gt;
<span style="color: rgba(0, 128, 128, 1)">139</span>             &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">140</span>             &lt;div className="editor-custom-btn-container"&gt;
<span style="color: rgba(0, 128, 128, 1)">141</span>               &lt;UploadImage className="editor-upload-btn" imageSuccessCBK={(arr)=&gt;{<span style="color: rgba(0, 0, 255, 1)">this</span>.imageSuccessCBK(arr)}}/&gt;
<span style="color: rgba(0, 128, 128, 1)">142</span>             &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">143</span>             &lt;Button type="primary" onClick={() =&gt; { <span style="color: rgba(0, 0, 255, 1)">this</span>.saveToGetContent() }}&gt;保存&lt;/Button&gt;
<span style="color: rgba(0, 128, 128, 1)">144</span>         &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">145</span>         &lt;/Page&gt;
<span style="color: rgba(0, 128, 128, 1)">146</span>       &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">147</span> <span style="color: rgba(0, 0, 0, 1)">    );
</span><span style="color: rgba(0, 128, 128, 1)">148</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">149</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">150</span>
<span style="color: rgba(0, 128, 128, 1)">151</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> Tinymce;</pre>
</div>
<p>上传图片组件,使用antd的部分组件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">2</span> import { Button, Modal, Icon, Upload, message } from 'antd'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">3</span> import PropTypes from 'prop-types'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> import styles from './index.less'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">5</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> const Dragger =<span style="color: rgba(0, 0, 0, 1)"> Upload.Dragger;
</span><span style="color: rgba(0, 128, 128, 1)">7</span>
<span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">class UploadImage extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 10</span>   static propTypes =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 11</span> <span style="color: rgba(0, 0, 0, 1)">    imageSuccessCBK: PropTypes.func,
</span><span style="color: rgba(0, 128, 128, 1)"> 12</span>
<span style="color: rgba(0, 128, 128, 1)"> 13</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 14</span>   static defaultProps =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 15</span>
<span style="color: rgba(0, 128, 128, 1)"> 16</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 17</span> <span style="color: rgba(0, 0, 0, 1)">constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)"> 18</span> <span style="color: rgba(0, 0, 0, 1)">    super(props);
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span>   <span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span>       visible: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(0, 0, 0, 1)">      listObj: {}
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(0, 0, 0, 1)">    };
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span>
<span style="color: rgba(0, 128, 128, 1)"> 25</span>   <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
</span><span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 128, 0, 1)">   * 显示弹框
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span> <span style="color: rgba(0, 128, 0, 1)">   *
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span> <span style="color: rgba(0, 128, 0, 1)">   *</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 29</span>   showModal = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span>       visible: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span>
<span style="color: rgba(0, 128, 128, 1)"> 35</span>   <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span> <span style="color: rgba(0, 128, 0, 1)"> * 确认
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 128, 0, 1)"> *
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 128, 0, 1)"> *</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 39</span>   handleOk = (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span>   const { imageSuccessCBK } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span>   const { listObj } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span>   const imagesFileArr = Object.keys(listObj).map(v =&gt;<span style="color: rgba(0, 0, 0, 1)"> listObj)
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">    imageSuccessCBK(imagesFileArr)
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span>       visible: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span> <span style="color: rgba(0, 0, 0, 1)">      listObj: {},
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span>       Uploading: <span style="color: rgba(0, 0, 255, 1)">false</span>
<span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span>
<span style="color: rgba(0, 128, 128, 1)"> 51</span>   handleCancel = (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span>       visible: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span> <span style="color: rgba(0, 0, 0, 1)">      listObj: {}
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span> <span style="color: rgba(0, 0, 0, 1)">render() {
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span>   const { loading } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span>   const { visible, listObj, Uploading } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span>   const props =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span>       name: 'file'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span>       multiple: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span>       action: '//jsonplaceholder.typicode.com/posts/'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span>       listType: 'picture'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span>       onChange: (info) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span>         const uid =<span style="color: rgba(0, 0, 0, 1)"> info.file.uid
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span>         const objKeyArr =<span style="color: rgba(0, 0, 0, 1)"> Object.keys(listObj)
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>         const status =<span style="color: rgba(0, 0, 0, 1)"> info.file.status;
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (status !== 'uploading'<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span> <span style="color: rgba(0, 0, 0, 1)">          console.log(info.file, info.fileList);
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (status === 'done') {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">已成功上传</span>
<span style="color: rgba(0, 128, 128, 1)"> 73</span>         <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span>             Uploading: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 0, 1)">          })
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span>         <span style="color: rgba(0, 0, 255, 1)">for</span> (let i = 0, len = objKeyArr.length; i &lt; len; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> (listObj].uid ===<span style="color: rgba(0, 0, 0, 1)"> uid) {
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span>               listObj].url =<span style="color: rgba(0, 0, 0, 1)"> info.file.thumbUrl
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span>               listObj].hasSuccess = <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)"> 80</span> <span style="color: rgba(0, 0, 0, 1)">            message.success(`${info.file.name} file uploaded successfully.`);
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span>               <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)"> 82</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span> <span style="color: rgba(0, 0, 0, 1)">          }
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span>
<span style="color: rgba(0, 128, 128, 1)"> 85</span>         } <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (status === 'error'<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span>         <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>             Uploading: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span> <span style="color: rgba(0, 0, 0, 1)">          })
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span> <span style="color: rgba(0, 0, 0, 1)">          message.error(`${info.file.name} file upload failed.`);
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (status === 'removed') {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">移除上传的</span>
<span style="color: rgba(0, 128, 128, 1)"> 92</span>         <span style="color: rgba(0, 0, 255, 1)">for</span> (let i = 0, len = objKeyArr.length; i &lt; len; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> (listObj].uid ===<span style="color: rgba(0, 0, 0, 1)"> uid) {
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>               <span style="color: rgba(0, 0, 255, 1)">delete</span><span style="color: rgba(0, 0, 0, 1)"> listObj]
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span> <span style="color: rgba(0, 0, 0, 1)">            message.success(`${info.file.name} file removed successfully.`);
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span>               <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span> <span style="color: rgba(0, 0, 0, 1)">          }
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">100</span> <span style="color: rgba(0, 0, 0, 1)">      },
</span><span style="color: rgba(0, 128, 128, 1)">101</span>       beforeUpload: (file) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">102</span>         <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">103</span>         Uploading: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">104</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">105</span>         const _self = <span style="color: rgba(0, 0, 255, 1)">this</span>
<span style="color: rgba(0, 128, 128, 1)">106</span>         const _URL = window.URL ||<span style="color: rgba(0, 0, 0, 1)"> window.webkitURL
</span><span style="color: rgba(0, 128, 128, 1)">107</span>         const fileName =<span style="color: rgba(0, 0, 0, 1)"> file.uid
</span><span style="color: rgba(0, 128, 128, 1)">108</span>         listObj =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)">109</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve, reject) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">110</span>         const img = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Image()
</span><span style="color: rgba(0, 128, 128, 1)">111</span>         img.src =<span style="color: rgba(0, 0, 0, 1)"> _URL.createObjectURL(file)
</span><span style="color: rgba(0, 128, 128, 1)">112</span>         img.onload = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
</span><span style="color: rgba(0, 128, 128, 1)">113</span>             listObj = { hasSuccess: <span style="color: rgba(0, 0, 255, 1)">false</span>, uid: file.uid, width: <span style="color: rgba(0, 0, 255, 1)">this</span>.width, height: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.height }
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">            _self.setState({
</span><span style="color: rgba(0, 128, 128, 1)">115</span> <span style="color: rgba(0, 0, 0, 1)">            listObj,
</span><span style="color: rgba(0, 128, 128, 1)">116</span> <span style="color: rgba(0, 0, 0, 1)">            })
</span><span style="color: rgba(0, 128, 128, 1)">117</span> <span style="color: rgba(0, 0, 0, 1)">          }
</span><span style="color: rgba(0, 128, 128, 1)">118</span>         resolve(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">119</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">120</span> <span style="color: rgba(0, 0, 0, 1)">      },
</span><span style="color: rgba(0, 128, 128, 1)">121</span> <span style="color: rgba(0, 0, 0, 1)">    };
</span><span style="color: rgba(0, 128, 128, 1)">122</span>
<span style="color: rgba(0, 128, 128, 1)">123</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">124</span>       &lt;div&gt;
<span style="color: rgba(0, 128, 128, 1)">125</span>         &lt;<span style="color: rgba(0, 0, 0, 1)">Button
</span><span style="color: rgba(0, 128, 128, 1)">126</span>         style={{ marginTop: 0<span style="color: rgba(0, 0, 0, 1)"> }}
</span><span style="color: rgba(0, 128, 128, 1)">127</span>         type="primary"
<span style="color: rgba(0, 128, 128, 1)">128</span>         shape="round"
<span style="color: rgba(0, 128, 128, 1)">129</span>         icon="upload"
<span style="color: rgba(0, 128, 128, 1)">130</span>         onClick={() =&gt; { <span style="color: rgba(0, 0, 255, 1)">this</span>.showModal() }}&gt;
<span style="color: rgba(0, 128, 128, 1)">131</span> <span style="color: rgba(0, 0, 0, 1)">          上传
</span><span style="color: rgba(0, 128, 128, 1)">132</span>            &lt;/Button&gt;
<span style="color: rgba(0, 128, 128, 1)">133</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">134</span>         visible ? &lt;<span style="color: rgba(0, 0, 0, 1)">Modal
</span><span style="color: rgba(0, 128, 128, 1)">135</span>             title="上传图片"
<span style="color: rgba(0, 128, 128, 1)">136</span>             visible=<span style="color: rgba(0, 0, 0, 1)">{visible}
</span><span style="color: rgba(0, 128, 128, 1)">137</span>             onCancel={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.handleCancel}
</span><span style="color: rgba(0, 128, 128, 1)">138</span>             footer=<span style="color: rgba(0, 0, 0, 1)">{[
</span><span style="color: rgba(0, 128, 128, 1)">139</span>               &lt;div key="1"&gt;
<span style="color: rgba(0, 128, 128, 1)">140</span>               &lt;Button onClick={() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span>.handleCancel()} loading={!!Uploading}&gt;取消&lt;/Button&gt;
<span style="color: rgba(0, 128, 128, 1)">141</span>               &lt;Button type="primary" style={{ marginLeft: 8 }} onClick={() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span>.handleOk()} loading={!!Uploading}&gt;
<span style="color: rgba(0, 128, 128, 1)">142</span> <span style="color: rgba(0, 0, 0, 1)">                  确定
</span><span style="color: rgba(0, 128, 128, 1)">143</span>               &lt;/Button&gt;
<span style="color: rgba(0, 128, 128, 1)">144</span>               &lt;/div&gt;]}
<span style="color: rgba(0, 128, 128, 1)">145</span>         &gt;
<span style="color: rgba(0, 128, 128, 1)">146</span>             &lt;Dragger {...props}&gt;
<span style="color: rgba(0, 128, 128, 1)">147</span>               &lt;p className="ant-upload-drag-icon"&gt;
<span style="color: rgba(0, 128, 128, 1)">148</span>               &lt;Icon type="inbox" /&gt;
<span style="color: rgba(0, 128, 128, 1)">149</span>               &lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">150</span>               &lt;p className="ant-upload-text"&gt;Click or drag file to <span style="color: rgba(0, 0, 255, 1)">this</span> area to upload&lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">151</span>               &lt;p className="ant-upload-hint"&gt;Support <span style="color: rgba(0, 0, 255, 1)">for</span> a single or bulk upload. Strictly prohibit from uploading company data or other band files&lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">152</span>             &lt;/Dragger&gt;
<span style="color: rgba(0, 128, 128, 1)">153</span>         &lt;/Modal&gt; : null
<span style="color: rgba(0, 128, 128, 1)">154</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">155</span>       &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">156</span> <span style="color: rgba(0, 0, 0, 1)">    );
</span><span style="color: rgba(0, 128, 128, 1)">157</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">158</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">159</span>
<span style="color: rgba(0, 128, 128, 1)">160</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> UploadImage;</pre>
</div>
<h3>2.3,Vue组件化</h3>
<p>&nbsp;&nbsp;直接放代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;template&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   &lt;div :class="{fullscreen:fullscreen}" class="tinymce-container editor-container"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>   &lt;div&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>   &lt;textarea :id="tinymceId" class="tinymce-textarea" /&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>   &lt;div class="editor-custom-btn-container"&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span>       &lt;editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" /&gt;
<span style="color: rgba(0, 128, 128, 1)">8</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">9</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)"> 10</span> &lt;/template&gt;
<span style="color: rgba(0, 128, 128, 1)"> 11</span>
<span style="color: rgba(0, 128, 128, 1)"> 12</span> &lt;script&gt;
<span style="color: rgba(0, 128, 128, 1)"> 13</span> import editorImage from './components/EditorImage'
<span style="color: rgba(0, 128, 128, 1)"> 14</span> import plugins from './plugins'
<span style="color: rgba(0, 128, 128, 1)"> 15</span> import toolbar from './toolbar'
<span style="color: rgba(0, 128, 128, 1)"> 16</span> import font from './font'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 17</span>
<span style="color: rgba(0, 128, 128, 1)"> 18</span> export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span>   name: 'Tinymce'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span> <span style="color: rgba(0, 0, 0, 1)">components: { editorImage },
</span><span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(0, 0, 0, 1)">props: {
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(0, 0, 0, 1)">    id: {
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">      type: String,
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span>       <span style="color: rgba(0, 0, 255, 1)">default</span>: <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> 'vue-tinymce-' + +<span style="color: rgba(0, 0, 255, 1)">new</span> Date() + ((Math.random() * 1000).toFixed(0) + ''<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span> <span style="color: rgba(0, 0, 0, 1)">    value: {
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span> <span style="color: rgba(0, 0, 0, 1)">      type: String,
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span>       <span style="color: rgba(0, 0, 255, 1)">default</span>: ''
<span style="color: rgba(0, 128, 128, 1)"> 31</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">    toolbar: {
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span> <span style="color: rgba(0, 0, 0, 1)">      type: Array,
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span>       required: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span>       <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> []
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span> <span style="color: rgba(0, 0, 0, 1)">    menubar: {
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span> <span style="color: rgba(0, 0, 0, 1)">      type: String,
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span>       <span style="color: rgba(0, 0, 255, 1)">default</span>: 'file edit insert view format table'
<span style="color: rgba(0, 128, 128, 1)"> 42</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">    height: {
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span> <span style="color: rgba(0, 0, 0, 1)">      type: Number,
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span>       required: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span>       <span style="color: rgba(0, 0, 255, 1)">default</span>: 520
<span style="color: rgba(0, 128, 128, 1)"> 47</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span> <span style="color: rgba(0, 0, 0, 1)">data() {
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span>       hasChange: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span>       hasInit: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span>       tinymceId: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.id,
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span>       fullscreen: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">      languageTypeList: {
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span>         'en': 'en'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span>         'zh': 'zh_CN'
<span style="color: rgba(0, 128, 128, 1)"> 58</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span> <span style="color: rgba(0, 0, 0, 1)">computed: {
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span> <span style="color: rgba(0, 0, 0, 1)">    language() {
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span>       <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.languageTypeList[<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$store.getters.language]
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span> <span style="color: rgba(0, 0, 0, 1)">watch: {
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span> <span style="color: rgba(0, 0, 0, 1)">    value(val) {
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>       <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">this</span>.hasChange &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.hasInit) {
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.$nextTick(() =&gt;
<span style="color: rgba(0, 128, 128, 1)"> 70</span>         window.tinymce.get(<span style="color: rgba(0, 0, 255, 1)">this</span>.tinymceId).setContent(val || ''<span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 73</span> <span style="color: rgba(0, 0, 0, 1)">    language() {
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span>       <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.destroyTinymce()
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.$nextTick(() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initTinymce())
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span> <span style="color: rgba(0, 0, 0, 1)">mounted() {
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initTinymce()
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span> <span style="color: rgba(0, 0, 0, 1)">activated() {
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initTinymce()
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(0, 0, 0, 1)">deactivated() {
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.destroyTinymce()
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span> <span style="color: rgba(0, 0, 0, 1)">destroyed() {
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.destroyTinymce()
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">methods: {
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span> <span style="color: rgba(0, 0, 0, 1)">    initTinymce() {
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span>       const _this = <span style="color: rgba(0, 0, 255, 1)">this</span>
<span style="color: rgba(0, 128, 128, 1)"> 93</span> <span style="color: rgba(0, 0, 0, 1)">      window.tinymce.init({
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>         language: 'zh_CN'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>         selector: `#${<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.tinymceId}`,
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span>         height: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.height,
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span>         body_class: 'panel-body '<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>         object_resizing: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span>         toolbar: <span style="color: rgba(0, 0, 255, 1)">this</span>.toolbar.length &gt; 0 ? <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.toolbar : toolbar,
</span><span style="color: rgba(0, 128, 128, 1)">100</span>         menubar: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.menubar,
</span><span style="color: rgba(0, 128, 128, 1)">101</span> <span style="color: rgba(0, 0, 0, 1)">      plugins: plugins,
</span><span style="color: rgba(0, 128, 128, 1)">102</span>         end_container_on_empty_block: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">103</span> <span style="color: rgba(0, 0, 0, 1)">      fontsize_formats: font.fontsizeFormats,
</span><span style="color: rgba(0, 128, 128, 1)">104</span> <span style="color: rgba(0, 0, 0, 1)">      font_formats: font.fontFormats,
</span><span style="color: rgba(0, 128, 128, 1)">105</span>         powerpaste_word_import: 'clean'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">106</span>         code_dialog_height: 450<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">107</span>         code_dialog_width: 1000<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">108</span>         advlist_bullet_styles: 'square'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">109</span>         advlist_number_styles: 'default'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">110</span>         imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'<span style="color: rgba(0, 0, 0, 1)">],
</span><span style="color: rgba(0, 128, 128, 1)">111</span>         default_link_target: '_blank'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">112</span>         link_title: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">113</span>         nonbreaking_force_tab: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> inserting nonbreaking space &amp;nbsp; need Nonbreaking Space Plugin</span>
<span style="color: rgba(0, 128, 128, 1)">114</span>         init_instance_callback: editor =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">115</span>         <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (_this.value) {
</span><span style="color: rgba(0, 128, 128, 1)">116</span> <span style="color: rgba(0, 0, 0, 1)">            editor.setContent(_this.value)
</span><span style="color: rgba(0, 128, 128, 1)">117</span> <span style="color: rgba(0, 0, 0, 1)">          }
</span><span style="color: rgba(0, 128, 128, 1)">118</span>         _this.hasInit = <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">119</span>         editor.on('NodeChange Change KeyUp SetContent', () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">120</span>             <span style="color: rgba(0, 0, 255, 1)">this</span>.hasChange = <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">121</span>             <span style="color: rgba(0, 0, 255, 1)">this</span>.$emit('input'<span style="color: rgba(0, 0, 0, 1)">, editor.getContent())
</span><span style="color: rgba(0, 128, 128, 1)">122</span> <span style="color: rgba(0, 0, 0, 1)">          })
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">      },
</span><span style="color: rgba(0, 128, 128, 1)">124</span> <span style="color: rgba(0, 0, 0, 1)">      setup(editor) {
</span><span style="color: rgba(0, 128, 128, 1)">125</span>         editor.on('FullscreenStateChanged', (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">126</span>             _this.fullscreen =<span style="color: rgba(0, 0, 0, 1)"> e.state
</span><span style="color: rgba(0, 128, 128, 1)">127</span> <span style="color: rgba(0, 0, 0, 1)">          })
</span><span style="color: rgba(0, 128, 128, 1)">128</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">129</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">130</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">131</span> <span style="color: rgba(0, 0, 0, 1)">    destroyTinymce() {
</span><span style="color: rgba(0, 128, 128, 1)">132</span>       const tinymce = window.tinymce.get(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.tinymceId)
</span><span style="color: rgba(0, 128, 128, 1)">133</span>       <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.fullscreen) {
</span><span style="color: rgba(0, 128, 128, 1)">134</span>         tinymce.execCommand('mceFullScreen'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">135</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">136</span>
<span style="color: rgba(0, 128, 128, 1)">137</span>       <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (tinymce) {
</span><span style="color: rgba(0, 128, 128, 1)">138</span> <span style="color: rgba(0, 0, 0, 1)">      tinymce.destroy()
</span><span style="color: rgba(0, 128, 128, 1)">139</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">140</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">141</span> <span style="color: rgba(0, 0, 0, 1)">    setContent(value) {
</span><span style="color: rgba(0, 128, 128, 1)">142</span>       window.tinymce.get(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.tinymceId).setContent(value)
</span><span style="color: rgba(0, 128, 128, 1)">143</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">144</span> <span style="color: rgba(0, 0, 0, 1)">    getContent() {
</span><span style="color: rgba(0, 128, 128, 1)">145</span>       window.tinymce.get(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.tinymceId).getContent()
</span><span style="color: rgba(0, 128, 128, 1)">146</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">147</span> <span style="color: rgba(0, 0, 0, 1)">    imageSuccessCBK(arr) {
</span><span style="color: rgba(0, 128, 128, 1)">148</span>       const _this = <span style="color: rgba(0, 0, 255, 1)">this</span>
<span style="color: rgba(0, 128, 128, 1)">149</span>       arr.forEach(v =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">150</span>         window.tinymce.get(_this.tinymceId).insertContent(`&lt;img class="wscnph" src="${v.url}" &gt;<span style="color: rgba(0, 0, 0, 1)">`)
</span><span style="color: rgba(0, 128, 128, 1)">151</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">152</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">153</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">154</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">155</span> &lt;/script&gt;
<span style="color: rgba(0, 128, 128, 1)">156</span>
<span style="color: rgba(0, 128, 128, 1)">157</span> &lt;style scoped&gt;
<span style="color: rgba(0, 128, 128, 1)">158</span> .tinymce-<span style="color: rgba(0, 0, 0, 1)">container {
</span><span style="color: rgba(0, 128, 128, 1)">159</span> <span style="color: rgba(0, 0, 0, 1)">position: relative;
</span><span style="color: rgba(0, 128, 128, 1)">160</span>   line-<span style="color: rgba(0, 0, 0, 1)">height: normal;
</span><span style="color: rgba(0, 128, 128, 1)">161</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">162</span> .tinymce-container&gt;&gt;&gt;.mce-<span style="color: rgba(0, 0, 0, 1)">fullscreen {
</span><span style="color: rgba(0, 128, 128, 1)">163</span>   z-index: 10000<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">164</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">165</span> .tinymce-<span style="color: rgba(0, 0, 0, 1)">textarea {
</span><span style="color: rgba(0, 128, 128, 1)">166</span> <span style="color: rgba(0, 0, 0, 1)">visibility: hidden;
</span><span style="color: rgba(0, 128, 128, 1)">167</span>   z-index: -1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">168</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">169</span> .editor-custom-btn-<span style="color: rgba(0, 0, 0, 1)">container {
</span><span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">171</span> <span style="color: rgba(0, 0, 0, 1)">right: 4px;
</span><span style="color: rgba(0, 128, 128, 1)">172</span> <span style="color: rgba(0, 0, 0, 1)">top: 4px;
</span><span style="color: rgba(0, 128, 128, 1)">173</span>   <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">z-index: 2005;</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)">174</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">175</span> .fullscreen .editor-custom-btn-<span style="color: rgba(0, 0, 0, 1)">container {
</span><span style="color: rgba(0, 128, 128, 1)">176</span>   z-index: 10000<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">177</span> <span style="color: rgba(0, 0, 0, 1)">position: fixed;
</span><span style="color: rgba(0, 128, 128, 1)">178</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">179</span> .editor-upload-<span style="color: rgba(0, 0, 0, 1)">btn {
</span><span style="color: rgba(0, 128, 128, 1)">180</span>   display: inline-<span style="color: rgba(0, 0, 0, 1)">block;
</span><span style="color: rgba(0, 128, 128, 1)">181</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">182</span> &lt;/style&gt;</pre>
</div>
<p><strong>上传图片组件,使用elementUI的部分组件:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;template&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   &lt;div class="upload-container"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>   &lt;el-button :style="{background:color,borderColor:color}" icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true"&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">      upload
</span><span style="color: rgba(0, 128, 128, 1)">5</span>   &lt;/el-button&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>   &lt;el-dialog :visible.sync="dialogVisible"&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span>       &lt;el-<span style="color: rgba(0, 0, 0, 1)">upload
</span><span style="color: rgba(0, 128, 128, 1)">8</span>         :multiple="true"
<span style="color: rgba(0, 128, 128, 1)">9</span>         :file-list="fileList"
<span style="color: rgba(0, 128, 128, 1)"> 10</span>         :show-file-list="true"
<span style="color: rgba(0, 128, 128, 1)"> 11</span>         :on-remove="handleRemove"
<span style="color: rgba(0, 128, 128, 1)"> 12</span>         :on-success="handleSuccess"
<span style="color: rgba(0, 128, 128, 1)"> 13</span>         :before-upload="beforeUpload"
<span style="color: rgba(0, 128, 128, 1)"> 14</span>         class="editor-slide-upload"
<span style="color: rgba(0, 128, 128, 1)"> 15</span>         action="https://httpbin.org/post"
<span style="color: rgba(0, 128, 128, 1)"> 16</span>         list-type="picture-card"
<span style="color: rgba(0, 128, 128, 1)"> 17</span>       &gt;
<span style="color: rgba(0, 128, 128, 1)"> 18</span>         &lt;el-button size="small" type="primary"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 19</span> <span style="color: rgba(0, 0, 0, 1)">          Click upload
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span>         &lt;/el-button&gt;
<span style="color: rgba(0, 128, 128, 1)"> 21</span>       &lt;/el-upload&gt;
<span style="color: rgba(0, 128, 128, 1)"> 22</span>       &lt;el-button @click="dialogVisible = false"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">      Cancel
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span>       &lt;/el-button&gt;
<span style="color: rgba(0, 128, 128, 1)"> 25</span>       &lt;el-button type="primary" @click="handleSubmit"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 0, 0, 1)">      Confirm
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>       &lt;/el-button&gt;
<span style="color: rgba(0, 128, 128, 1)"> 28</span>   &lt;/el-dialog&gt;
<span style="color: rgba(0, 128, 128, 1)"> 29</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)"> 30</span> &lt;/template&gt;
<span style="color: rgba(0, 128, 128, 1)"> 31</span>
<span style="color: rgba(0, 128, 128, 1)"> 32</span> &lt;script&gt;
<span style="color: rgba(0, 128, 128, 1)"> 33</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> import { getToken } from 'api/qiniu'</span>
<span style="color: rgba(0, 128, 128, 1)"> 34</span>
<span style="color: rgba(0, 128, 128, 1)"> 35</span> export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span>   name: 'EditorSlideUpload'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">props: {
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">    color: {
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span> <span style="color: rgba(0, 0, 0, 1)">      type: String,
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span>       <span style="color: rgba(0, 0, 255, 1)">default</span>: '#1890ff'
<span style="color: rgba(0, 128, 128, 1)"> 41</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">data() {
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span>       dialogVisible: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span> <span style="color: rgba(0, 0, 0, 1)">      listObj: {},
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span> <span style="color: rgba(0, 0, 0, 1)">      fileList: []
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">methods: {
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span> <span style="color: rgba(0, 0, 0, 1)">    checkAllSuccess() {
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span>       <span style="color: rgba(0, 0, 255, 1)">return</span> Object.keys(<span style="color: rgba(0, 0, 255, 1)">this</span>.listObj).every(item =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.listObj.hasSuccess)
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span> <span style="color: rgba(0, 0, 0, 1)">    handleSubmit() {
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span>       const arr = Object.keys(<span style="color: rgba(0, 0, 255, 1)">this</span>.listObj).map(v =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.listObj)
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span>       <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.checkAllSuccess()) {
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.$message('Please wait for all images to be uploaded successfully. If there is a network problem, please refresh the page and upload again!'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span>         <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)"> 59</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.$emit('successCBK'<span style="color: rgba(0, 0, 0, 1)">, arr)
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.listObj =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.fileList =<span style="color: rgba(0, 0, 0, 1)"> []
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.dialogVisible = <span style="color: rgba(0, 0, 255, 1)">false</span>
<span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span> <span style="color: rgba(0, 0, 0, 1)">    handleSuccess(response, file) {
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span>       const uid =<span style="color: rgba(0, 0, 0, 1)"> file.uid
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span>       const objKeyArr = Object.keys(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.listObj)
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>       <span style="color: rgba(0, 0, 255, 1)">for</span> (let i = 0, len = objKeyArr.length; i &lt; len; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.listObj].uid ===<span style="color: rgba(0, 0, 0, 1)"> uid) {
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.listObj].url =<span style="color: rgba(0, 0, 0, 1)"> response.files.file
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.listObj].hasSuccess = <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)"> 72</span>         <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)"> 73</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span> <span style="color: rgba(0, 0, 0, 1)">    handleRemove(file) {
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span>       const uid =<span style="color: rgba(0, 0, 0, 1)"> file.uid
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span>       const objKeyArr = Object.keys(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.listObj)
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span>       <span style="color: rgba(0, 0, 255, 1)">for</span> (let i = 0, len = objKeyArr.length; i &lt; len; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.listObj].uid ===<span style="color: rgba(0, 0, 0, 1)"> uid) {
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span>         <span style="color: rgba(0, 0, 255, 1)">delete</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.listObj]
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span>         <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)"> 83</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">    beforeUpload(file) {
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>       const _self = <span style="color: rgba(0, 0, 255, 1)">this</span>
<span style="color: rgba(0, 128, 128, 1)"> 88</span>       const _URL = window.URL ||<span style="color: rgba(0, 0, 0, 1)"> window.webkitURL
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span>       const fileName =<span style="color: rgba(0, 0, 0, 1)"> file.uid
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.listObj =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span>       <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve, reject) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span>         const img = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Image()
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span>         img.src =<span style="color: rgba(0, 0, 0, 1)"> _URL.createObjectURL(file)
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>         img.onload = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>         _self.listObj = { hasSuccess: <span style="color: rgba(0, 0, 255, 1)">false</span>, uid: file.uid, width: <span style="color: rgba(0, 0, 255, 1)">this</span>.width, height: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.height }
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span>         resolve(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">100</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">101</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">102</span> &lt;/script&gt;
<span style="color: rgba(0, 128, 128, 1)">103</span>
<span style="color: rgba(0, 128, 128, 1)">104</span> &lt;style lang="scss" scoped&gt;
<span style="color: rgba(0, 128, 128, 1)">105</span> .editor-slide-<span style="color: rgba(0, 0, 0, 1)">upload {
</span><span style="color: rgba(0, 128, 128, 1)">106</span>   margin-<span style="color: rgba(0, 0, 0, 1)">bottom: 20px;
</span><span style="color: rgba(0, 128, 128, 1)">107</span>   /deep/ .el-upload--picture-<span style="color: rgba(0, 0, 0, 1)">card {
</span><span style="color: rgba(0, 128, 128, 1)">108</span>   width: 100%<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">110</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">111</span> &lt;/style&gt;</pre>
</div>
<h2>三,使用</h2>
<h3>3.1,React</h3>
<p>&nbsp;第一步:导入组件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import Tinymce from '../../components/Tinymce';</pre>
</div>
<p>第二步:使用组件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">Tinymce
</span><span style="color: rgba(0, 128, 128, 1)">2</span>             <span style="color: rgba(255, 0, 0, 1)">content</span><span style="color: rgba(0, 0, 255, 1)">={''}
</span><span style="color: rgba(0, 128, 128, 1)">3</span>               <span style="color: rgba(255, 0, 0, 1)">tinymceId</span><span style="color: rgba(0, 0, 255, 1)">='tinymceIdDemo'
</span><span style="color: rgba(0, 128, 128, 1)">4</span>               <span style="color: rgba(255, 0, 0, 1)">getContent</span><span style="color: rgba(0, 0, 255, 1)">={(content) =</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> { this.getContent(content) }}
</span><span style="color: rgba(0, 128, 128, 1)">5</span>             /&gt;</pre>
</div>
<p>第三步:获取输入的富文本</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)"> getContent(content) {
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   console.log('content==='<span style="color: rgba(0, 0, 0, 1)">,content)
</span><span style="color: rgba(0, 128, 128, 1)">3</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">      content
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">    })
</span><span style="color: rgba(0, 128, 128, 1)">6</span>   }</pre>
</div>
<p>第四步:文本渲染</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)"> {/* 渲染标签字符串 */}
</span><span style="color: rgba(0, 128, 128, 1)">2</span>             <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">dangerouslySetInnerHTML</span><span style="color: rgba(0, 0, 255, 1)">={{ </span><span style="color: rgba(255, 0, 0, 1)">__html: content }}</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>第五步:效果</p>
<p>图片上传成功效果</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201904/1040068-20190428155448611-1071252164.png" alt=""></p>
<p>完成效果展示</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201904/1040068-20190428155509880-559507609.png" alt=""></p>
<h3>3.2,Vue</h3>
<p>&nbsp;&nbsp;第一步:引入组件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import Tinymce from '@/components/Tinymce'</pre>
</div>
<p>&nbsp;&nbsp;第二步:注册组件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>   components: { Tinymce },</pre>
</div>
<p>&nbsp; 第三步:使用组件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>&lt;div&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>       &lt;tinymce v-model="content" :height="300" /&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>   &lt;/div&gt;</pre>
</div>
<p>&nbsp; 第四步:获取内容</p>
<p>利用vue的数据双向绑定</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)"> getContent() {
</span><span style="color: rgba(0, 128, 128, 1)">2</span>       console.log(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.content)
</span><span style="color: rgba(0, 128, 128, 1)">3</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.hasContent = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.content
</span><span style="color: rgba(0, 128, 128, 1)">4</span>   }</pre>
</div>
<p>&nbsp; 第五步:渲染获取的内容</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;div class="editor-content" v-html="hasContent" /&gt;</pre>
</div>
<p>&nbsp; 第六步:效果图</p>
<p>图片上传成功效果</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201904/1040068-20190428160237895-1784685657.png" alt=""></p>
<p>完整效果</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201904/1040068-20190428160248591-484178794.png" alt=""></p><br><br>
来源:https://www.cnblogs.com/jackson-yqj/p/10782220.html
頁: [1]
查看完整版本: 富文本编辑器TinyMCE的使用(React Vue)