之前在開發中也用過其它的編輯器,但是覺得不比tinymce功能多,而且不依賴后端,比如圖片的上傳,圖片大小可調整等,保留復制時的樣式等,具體使用方法如下:
一.安裝tinymce資源 npm install @tinymce/tinymce-vue -S
tinymce 默認是英文界面,所以還需要下載一個中文語言包,在腳手架Vue-cli3下需要把語言包放在public下,我的做法時在public目錄下新建一個tinymce文件夾,然后把語言包放在tinnymce文件夾里,
二. 把tinymce封裝成一個組件,方便后期復用
<template> <div class="tinymce-editor"> <editor v-model="myValue" :init="init" :disabled="disabled" @onClick="onClick"></editor> </div> </template> <script> import tinymce from "tinymce/tinymce"; import Editor from "@tinymce/tinymce-vue"; import "tinymce/themes/silver"; // 編輯器插件plugins // 更多插件參考:https://www.tiny.cloud/docs/plugins/ import "tinymce/plugins/lists"; import "tinymce/plugins/image"; // 插入上傳圖片插件 import "tinymce/plugins/imagetools"; import "tinymce/plugins/table"; // 插入表格插件 import "tinymce/plugins/lists"; // 列表插件 import "tinymce/plugins/emoticons"; //表情插件 import "tinymce/plugins/link"; //插入鏈接 import "tinymce/plugins/fullscreen"; import "tinymce/plugins/anchor"; // import "tinymce/plugins/autosave" import "tinymce/plugins/autoresize"; //內容自適應插件 import {getUrl2} from '../utils/request.js' export default { components: { Editor }, props: { value: { type: String, default: "" }, // 基本路徑,默認為空根目錄,如果你的項目發布后的地址為目錄形式, // 即abc.com/tinymce,baseUrl需要配置成tinymce,不然發布后資源會找不到 baseUrl: { type: String, default: "" }, disabled: { type: Boolean, default: false }, plugins: { type: [String, Array], default: "lists image imagetools link fullscreen anchor autoresize" }, toolbar: { type: [String, Array], default: "bold italic forecolor backcolor | styleselect| bullist numlist | lists image link | removeformat|fullscreen" } }, data() { return { init: { language_url: "/tinymce/langs/zh_CN.js", language: "zh_CN", skin_url: "/tinymce/skins/ui/oxide", emoticons_database_url: "/tinymce/emoticons/js/emojis.js", content_css: "/tinymce/skins/content/default/content.min.css", // skin_url: `${this.baseUrl}/tinymce/skins/ui/oxide-dark`, // 暗色系 // content_css: `${this.baseUrl}/tinymce/skins/content/dark/content.css`, // 暗色系 statusbar: false, // 隱藏編輯器底部的狀態欄 selector: "textarea", // change this value according to your HTML plugins: this.plugins, min_height: 240, toolbar: this.toolbar, branding: false, menubar: false, // 此處為圖片上傳處理函數,這個直接用了base64的圖片形式上傳圖片, // 如需ajax上傳可參考https://www.tiny.cloud/docs/configure/file-image-upload/#images_upload_handler images_upload_handler: (blobInfo, success, failure) => { //const img = "data:image/jpeg;base64," + blobInfo.base64(); // success(img); var xhr, formData; xhr = new XMLHttpRequest(); xhr.withCredentials = false; xhr.open("POST", `${getUrl2()}/comment/uploadFtp`); xhr.setRequestHeader("Authorization",localStorage.getItem("Authorization")); //設置請求頭 xhr.onload = function() { var json; if (xhr.status != 200) { failure("HTTP Error: " + xhr.status); return; } json = JSON.parse(xhr.responseText); if (!json || typeof json.object!= "string") { failure("Invalid JSON: " + xhr.responseText); return; } success(json.object); }; formData = new FormData(); formData.append("file", blobInfo.blob(), blobInfo.filename()); xhr.send(formData); } }, myValue: this.value }; }, mounted() { tinymce.init({}); }, methods: { // 添加相關的事件,可用的事件參照文檔=> https://github.com/tinymce/tinymce-vue => All available events // 需要什么事件可以自己增加 onClick(e) { this.$emit("onClick", e, tinymce); }, // 可以添加一些自己的自定義事件,如清空內容 clear() { this.myValue = ""; }, onChage(e) {}, async uploadImg(FormData) { let res = await this.$api2.upload_img(FormData); } }, watch: { value(newValue) { this.myValue = newValue; }, myValue(newValue) { this.$emit("input", newValue); } } }; </script>
三.效果圖如下