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

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

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

推薦する

Nginx で CDN サーバーを構築する方法の詳細な説明 (画像とテキスト)

Nginxのproxy_cacheを使用してキャッシュサーバーを構築する1: ngx_cache_...

MySQLオンラインDDL gh-ostの使用の概要

背景: DBA として、大規模なテーブルの DDL 変更のほとんどは、Percona の pt-on...

泡の小さな鋭角効果を実現するCSS

効果画像(境界線の色が薄すぎるので、{} で囲みます): { }参考リンク Pure CSS バブル...

MySQL はどのようにしてデータベースの削除と暴走を効果的に防ぐことができますか?

目次セーフモード設定テスト1. where句なしで更新および削除する2. 非インデックスキーの削除3...

Nginx リバース プロキシと負荷分散の実践

リバースプロキシリバースプロキシとは、プロキシサーバーを介してユーザーのアクセス要求を受信し、ユーザ...

Docker ベースの ELK を素早く構築する方法

[概要] この記事では、自作の Docker プラットフォームをベースに完全な ELK システムを素...

Vueのフロントエンドとバックエンドのポートの不一致の問題を解決する

Vue のフロントエンドとバックエンドのポートが一致していませんconfig index.jsファイ...

JavaScript キャンバスはマウスの動きに合わせてボールを動かすことを実装します

この記事の例では、マウスに従ってボールを動かすjsの具体的なコードを参考までに共有しています。具体的...

JavaScript 履歴オブジェクトの説明

目次1. ルートナビゲーション2. 履歴状態管理API (1)ハッシュチェンジイベント(2)ポップス...

jsネイティブウォーターフォールフロープラグイン制作

この記事では、jsネイティブウォーターフォールフロープラグインの具体的なコードを参考までに共有します...

CSS+SVGでBステーションの課金効果を実現するサンプルコード

困難SVG グラフィックの 2 つのマスクの作成まず、コード左側のピンク色のボックスの内容ですこれに...

CentOS7 インストール Zabbix 4.0 チュートリアル (イラストとテキスト)

SeLinuxを無効にするsetenforce 0永久に閉店: vi /etc/selinux/c...

Prometheus を使用して、MySQL の自動増分主キーの残りの使用可能パーセンテージをカウントします。

最近、本番環境のデータベースがログデータを狂ったように書き込み、主キー値のオーバーフローを引き起こし...

MySQLデータベースインデックスの左端一致原則

目次1. 共同インデックスの説明2. ac はインデックスを使用できますか? 3. 考える4. 最左...

docker-composeの詳細なインストールと使用方法

Docker Compose は、複雑なアプリケーションを定義および実行するための Docker ツ...