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 リッチテキストエディタとカスタマイズされた画像挿入

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

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

推薦する

Linux に setup.py プログラムをインストールする方法

まず次のコマンドを実行します: [root@mini61 setuptools-8.2.1]# py...

jsとcssのブロッキング問題の詳細な分析

目次DOMContentLoadedとロードjs ブロッキングとは何ですか? CSS ブロッキングと...

Dockerコンテナのk8sデプロイメントの実装

環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...

ブラウザは関連するHTTPヘッダーをキャッシュし、HTTPリクエストの数を最小限に抑えます。

最近、Yahoo の 34 の黄金律を読み、ウェブサイトのパフォーマンスを最適化する方法を学びました...

ウェブフロントエンド開発の細部

1 選択タグは閉じられている必要があります <select></select>...

jsを使用してシンプルなカルーセル効果を実現する

この記事では、シンプルなカルーセル効果を実現するためのjsの具体的なコードを参考までに紹介します。具...

W3Cチュートリアル(1):W3Cを理解する

1994 年に設立された組織である W3C は、共通プロトコルの開発を促進し、それらの相互運用性を確...

CSSインジェクションの知識の要約

最近のブラウザでは、CSS 内で JavaScript を実行することはできなくなりました。以前は、...

JavaScript でよく使われる 3 つの Web エフェクトの詳細な説明

目次1要素オフセットシリーズ1.1 オフセットの概要1.2 オフセットとスタイルの違い視覚領域クライ...

ドラッグ可能で編集可能なガントチャートの詳細な説明(HighchartsはVueとReactで使用できます)

序文Excel は強力で、広く使用されています。 Web アプリケーションの登場と改善に伴い、ユーザ...

MySQL はパスワード強度の検証をオフにします

パスワード強度検証について: [root@mysql mysql]# mysql -uroot -p...

テーブルの最大幅と最小幅を設定する際の互換性の問題と解決策の詳細な説明

テーブル内の min-width と max-width プロパティの設定 <テーブル>...

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

select @@session.tx_read_only が DB に大量に出現するのはなぜですか?

問題を見つける上位の SQL ステートメントを取得すると、DB が大量のselect @@sessi...

任意の長さの配列を作成または埋めるための JS のヒントの要約

目次序文直接充填方式for ループの push() メソッド配列コンストラクタメソッド配列コンストラ...