Tinymce リッチテキストを使用して Vue のツールバーボタンをカスタマイズする実践

Tinymce リッチテキストを使用して Vue のツールバーボタンをカスタマイズする実践

リッチ テキスト エディターは数多くありますが、人気のあるものとしては、UEditor、kindeditor、CKEditor などがあります。しかし、今日は tniyMCE のプラグイン開発を実装します。

tinymce、tinymce ts、tinymce-vue 宣言ファイルをインストールする

npm をインストール tinymce -S
npm インストール @types/tinymce -S
npm をインストールします @tinymce/tinymce-vue -S

パッケージコンポーネント

<テンプレート>
    <div>
        <エディター:id="id" v-model="content" :init="init"></エディター>
    </div>
</テンプレート>

<script lang="ts">
'vue-property-decorator' から { Component、Prop、Vue、Watch } をインポートします。

'tinymce' から tinymce をインポートします。
'@tinymce/tinymce-vue' から Editor をインポートします。

'tinymce/themes/silver/theme' をインポートします。
'tinymce/plugins/image' をインポートします。
'tinymce/plugins/link' をインポートします。
'tinymce/plugins/code' をインポートします。
'tinymce/plugins/table' をインポートします。
'tinymce/plugins/lists' をインポートします。
'tinymce/plugins/contextmenu' をインポートします。
'tinymce/plugins/wordcount' をインポートします。
'tinymce/plugins/colorpicker' をインポートします。
'tinymce/plugins/textcolor' をインポートします。
'tinymce/plugins/media' をインポートします。
'tinymce/plugins/fullscreen' をインポートします。
'tinymce/plugins/preview' をインポートします。
'tinymce/plugins/pagebreak' をインポートします。
'tinymce/plugins/insertdatetime' をインポートします。
'tinymce/plugins/hr' をインポートします。
'tinymce/plugins/paste' をインポートします。
'tinymce/plugins/codesample' をインポートします。
'tinymce/icons/default/icons' をインポートします。

コンソールにログ出力します。

@Component({ name: 'TinymceEditer', components: { エディター } })
エクスポートデフォルトクラスはVueを拡張します{
    //プロパティIDを設定する
    @Prop({ デフォルト: 'vue-tinymce-' + +new Date() }) id!: 文字列;
 
 //デフォルトの高さ @Prop({ default: 300 }) height!: number;

    @Prop({ デフォルト: '' })
    プライベート値!: 文字列;

    プライベートコンテンツ: 文字列 = '';

    @Watch('値')
    プライベートonChangeValue(newVal: 文字列) {
        this.content = newVal;
    }

    @Watch('コンテンツ')
    プライベートonChangeContent(newVal: 文字列) {
        this.$emit('input', newVal);
    }

    //リッチテキストボックスの初期化構成 private get init() {
        戻る {
            セレクター: '#' + this.id, //リッチテキストエディターID
            language: 'zh_CN', //言語language_url: '/tinymce/zh_CN.js', //言語パッケージkin_url: '/tinymce/skins/ui/oxide', //エディターが正しく動作するにはスキンが必要なので、前にコピーしたスキンファイルを指すように skin_url を設定しますmenubar: false, //メニューバーplugins:
                'リンク リスト 画像 コード テーブル カラーピッカー テキストカラー 単語数 コンテキストメニュー メディア テーブル 全画面プレビュー ページブレーク 挿入日時 時間 貼り付け コードサンプル 絵文字', //プラグイン ツールバー:
                : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
            //実行をインスタンス化 init_instance_callback: (editor: any) => {
                this.content && editor.setContent(this.content);

                //this.hasInit = true
                editor.on('NodeChange KeyUp SetContent を変更', () => {
                    //this.hasChange = true
                    コンテンツを編集します。
                });
            },

            //ビデオ設定コールバック video_template_callback: (data: any) => {
                `<ビデオ幅=" を返します
                    ${data.width} " 高さ="${data.height}"
                    ${data.poster ? 'poster="' + data.poster + '"' : ''}
                    コントロール="コントロール">
                    <ソース src="${data.source}"/>
                </ビデオ>`;
            },

            // 画像を貼り付けるコールバック images_upload_handler: (blobInfo: any, success: Function, failure: Function) => {
                this.handleImgUpload(blobInfo、成功、失敗);
            },
        };
    }

    プライベートマウント() {
        this.content = this.value;
    }

    //写真をアップロード private handleImgUpload(blobInfo: any, success: Function, failure: Function) {
        this.$emit('upload', blobInfo, success, failure);
    }
}
</スクリプト>

<スタイル lang="scss">
.tox-tinymce-aux {
    z-index: 3000 !重要;
}
</スタイル>

コンポーネントの使用

<テンプレート>
   <tinymce v-model="コンテンツ" />
</テンプレート>

<script lang="ts">
'vue-property-decorator' から Component、Vue } をインポートします。
'@/components/tinymce/tinymce.vue' から Tinymce をインポートします。

@成分({
    コンポーネント:
        ティニムス、
    },
})
エクスポートデフォルトクラスはVueを拡張します{
    プライベートコンテンツ: 文字列 = '';
}
</スクリプト>

<style lang="scss" スコープ></style>

Vue は Tinymce リッチテキストエディタを使用してツールバーボタンをカスタマイズします

ここに画像の説明を挿入

ここで縮小ボタンを追加しました

 初期化: {
        言語: "zh_CN",
        スキンのURL: "/tinymce/skins/ui/oxide",
        高さ: "100%",
        フォントサイズ形式: "8pt 10pt 12pt 14pt 16pt 18pt 24pt 36pt",
        フォントフォーマット:
          "Microsoft YaHei=Microsoft YaHei;Founder FangSong_GBK=Founder FangSong_GBK;Songti=simsun,serif;FangSongti=FangSong,serif;Boldti=SimHei;Times New Roman=Times New Roman;",
        プラグイン: {
	      タイプ: [文字列、配列],
	      デフォルト: "コード リスト 画像 メディア テーブル 単語数 インデント 2em"
	    、
        ツールバー:
	      タイプ: [文字列、配列],
	      デフォルト:
	        「コード | 行の高さ | 元に戻す やり直し | フォントサイズ選択 | フォント選択 | 形式選択 | 太字 斜体 前景色 背景色 | alignleft aligncenter alignright alignjustify | myCustomToolbarButton | 箇条書き 数値リスト アウトデント インデント indent2em | リスト 画像 メディア テーブル | 形式を削除」
	    },
        ブランディング: 偽、
        メニューバー: false、
        セットアップ: エディター => {
          _this = this とします。
          editor.ui.registry.addButton("myCustomToolbarButton", {
            テキスト:「縮小」、
            onAction: 関数() {
              _this.show= !_this.show;
            }
          });
        }
      },

キーコード

ここでは矢印関数が使われています => Vue のプロパティとイベントを操作するため

 セットアップ: エディター => {
    _this = this とします。
    editor.ui.registry.addButton("myCustomToolbarButton", {
      テキスト:「縮小」、
      onAction: 関数() {
        _this.show= !_this.show;
      }
    });
  }

これで、Tinymce リッチ テキストを使用して Vue のツールバー ボタンをカスタマイズする実践に関するこの記事は終了です。Vue Tinymce カスタム ツールバーの関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue はリッチ テキスト エディタ Vue-Quill-Editor を使用します (カスタム画像アップロード サービス、明確なコピー アンド ペースト スタイルなどを含む)
  • Vue+Element UI+vue-quill-editor リッチテキストエディタとカスタマイズされた画像挿入

<<:  画像ボタン送信とフォーム繰り返し送信の問題に関する議論

>>:  フレックスインサイドボタンの垂直方向の中央揃えが中央揃えにならない問題の解決方法

推薦する

Vue の better-scroll コンポーネントを使用して水平スクロール機能を実現する

について最近、Vue を学習する過程で、基本的な知識の練習と強化を目的として、Qunar.com の...

JS で単一ファイルコンポーネントを実装する方法

目次概要単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...

Pythonで書かれたWebアプリケーションをDockerでデプロイする実践

目次1. Dockerをインストールする2. コードを書く3. Dockerfileを書く4. 画像...

nofollowタグの使用と分析に関する簡単な説明

nofollowをめぐる論争Zac と Guoping の間では、nofollow が PR を無駄...

CSS3 クリアフロートメソッドの例

1. 目的この記事を通じて、誰もがフロートをクリアする原理と方法を理解し、最終的にこの記事が最良であ...

IDEA 2020.3.1 で Tomcat をデプロイし、最初の Web プロジェクトを作成するプロセスの詳細な説明

目次Tomcat の紹介Tomcat の展開Web プロジェクトの作成tomcatの設定プロジェクト...

Docker+Jenkinsによる自動デプロイの実現方法

Code Cloud を使用して Git コード ストレージ ウェアハウスを構築するhttps://...

MySQLの起動失敗の解決策

MySQLの起動失敗の解決策MySQLを起動できませんmysqlを停止した後、いくつかの操作(ホスト...

nginx をコンパイルしてインストールした後、スムーズに nginx をアップグレードする方法

nginx をコンパイルしてインストールし、一定期間使用した後、現在のバージョンに脆弱性があることや...

MySQLにおける静的変数の役割の詳細な説明

MySQLにおける静的変数の役割の詳細な説明静的変数の使用 静的変数サンプルコード: 関数テスト()...

MySQL MHA 操作ステータス監視の概要

目次1. プロジェクトの説明1.1 背景1.2 実装設計1.2.1 従来の方法1.2.2 最適化され...

HTML2 キャンバス SVG が認識されない場合の解決策

ウェブページを画像としてキャプチャする新機能があったので、人気のhtml2canvasを使ってみまし...

Vue/React シングルページ アプリケーションをリフレッシュなしで復元するソリューション

目次導入なぜわざわざ?落とし穴のあるコミュニティソリューション(Vue を例に挙げる)現時点では良い...

ノードを使用して静的ファイルキャッシュを実装する方法

目次キャッシュキャッシュ位置の分類キャッシュ設定ヘッダーNodeは静的ファイルキャッシュを実装する強...

2018 年にリリースされる Apache Spark 2.4 の新機能は何ですか?

この記事は、2018 年 9 月 19 日に Adob​​e Systems Inc で開催された ...