簡單的一個小項目完結,第一次用富文本簡單記錄總結一下~
純個人了解
一、npm安裝wangeditor
npm install [email protected] --save
我這裡用的是指定版本,也可以不用指定,看個人喜好
二、在需要用到的地方引入
import E from "wangeditor";
三、建立一個用于初始化編輯器的DOM
<el-form-item label="工作職責">
<div ref="zhizein"></div>
</el-form-item>
四、在methods裡寫初始化函數
initwangeditor() {
this.editor = new E(this.$refs.zhizein); // 找到初始化的dom
// 配置頂部菜單
this.editor.config.menus = [
"list", // 清單
"justify", // 對齊方式
];
// 編輯器編輯區域内容你變化時
this.editor.config.onchange = (html) => {
// 賦給data裡的變量儲存下來
this.form.zhize = html; // html就是輸入的内容(有格式的)
// console.log(this.form.zhize, "this.form.zhize");
};
this.editor.config.zIndex = 1 // 因為有覆寫,設定了編輯的z-index
// 建立富文本編輯器
this.editor.create();
},
五、在頁面加載時初始化
mounted() {
this.initwangeditor();
},
這樣就可以有一個簡單的富文本編輯器啦~
效果如圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHLHFHT1g2SyVzMtkVNsJDc1YmNZVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxkzMwMzN0YTMxETOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
當然,在vue中最好是做成元件,上面的小例子僅僅是入門的使用方法,下面,我準備把他封裝一下,争取拿來就能用。話不多說,上代碼~
一、在components檔案夾下建立wangEnduit.vue檔案,内容如下:
可以直接CV,但請注意
将圖檔上傳位址完善,大約在80行。
<template >
<div class="editor">
<div ref="toolbar" class="toolbar">
</div>
<div ref="editor" class="text">
</div>
</div>
</template>
<script>
import E from "wangeditor";
export default {
name: "editoritem",
data() {
return {
editor: null,
info_: null,
};
},
model: {
prop: "value",
event: "change",
},
// 接收父元件的傳值
props: {
value: { // 輸入的内容
type: String,
default: "",
},
isClear: { // 是否清空
type: Boolean,
default: false,
},
// 編輯時回顯的内容
contxt: {
type: String,
default: "",
},
},
watch: {
contxt(contxt) {
// 在這裡監聽,如果說回顯時,把回顯的内容放到編輯區域
if (contxt !== "") {
this.editor.txt.html(this.contxt);
}
},
isClear(val) {
// 觸發清除
if (val) {
this.editor.txt.clear();
this.info_ = null;
}
},
value: function (value) {
// 當内容發生變化是
if (value !== this.editor.txt.html()) {
this.editor.txt.html(this.value);
}
},
},
mounted() {
this.seteditor();
// 可能是個無效的判斷,因為要區分編輯(回顯)跟新增
if (this.contxt == "") {
// console.log("這是在修改文章");
} else {
this.editor.txt.html(this.value);
}
},
methods: {
seteditor() {
// 初始化一下
this.editor = new E(this.$refs.toolbar, this.$refs.editor);
// 這裡是圖檔上傳部分
// 首先,把token拿出來
let token = localStorage.getItem("token");
this.editor.config.uploadImgShowBase64 = false; // base64格式
this.editor.config.uploadImgServer = 後端檔案上傳位址; // 圖檔上傳的位址,這個是後端寫好的
this.editor.config.uploadImgHeaders = {
token,
"Access-Control-Allow-Origin": "*",
}// 請求頭,因為第一次跨域了
this.editor.config.uploadFileName = "file"; // 後端接受上傳檔案的參數名
this.editor.config.uploadImgMaxSize = 2 * 1024 * 1024; // 圖檔大小限制為 2M
this.editor.config.uploadImgMaxLength = 6; // 一次最多上傳 3 張
this.editor.config.uploadImgTimeout = 3 * 60 * 1000; // 逾時
// 配置富文本的菜單,或者叫功能
this.editor.config.menus = [
"head", // 标題
"bold", // 粗體
"fontSize", // 字号
"fontName", // 字型
"italic", // 斜體
"underline", // 下劃線
"strikeThrough", // 删除線
"foreColor", // 文字顔色
"backColor", // 背景顔色
"link", // 插傳入連結接
"list", // 清單
"justify", // 對齊方式
"quote", // 引用
"emoticon", // 表情
"image", // 插入圖檔
"table", // 表格
"video", // 插入視訊
"code", // 插入代碼
"undo", // 撤銷
"redo", // 重複
"fullscreen", // 全屏
];
this.editor.config.uploadImgHooks = {
fail: (xhr, editor, result) => {
// 插入圖檔失敗回調
},
success: (xhr, editor, result) => {
// 圖檔上傳成功回調
},
timeout: (xhr, editor) => {
// 網絡逾時的回調
},
error: (xhr, editor) => {
// 圖檔上傳錯誤的回調
},
customInsert: (insertImg, result, editor) => {
// console.log(result, "result");
//result為上傳圖檔成功的時候傳回的資料,這裡我們需要後端傳回的圖檔位址,輸出一下就能拿到
let url = result.data;
insertImg(url);//圖檔的函數
},
};
this.editor.config.onchange = (html) => {
this.info_ = html; // 綁定目前逐漸地值
this.$emit("change", this.info_); // 将内容同步到父元件中
};
// 建立富文本編輯器
this.editor.create();
},
},
};
</script>
<style >
.editor {
width: 100%;
margin: 0 auto;
position: relative;
z-index: 0;
}
.toolbar {
border: 1px solid #ccc;
}
.text {
border: 1px solid #ccc;
height: 500px;
/*height: 500px; */
overflow-y: auto;
}
</style>
元件整好了,接下來就是使用了
一、在要是用的地方引入、注冊、使用
import EditorBar from "@/components/wangEnduit";
components: {
EditorBar,
},
data:
data() {
return {
detail: "",
isClear: false,
news: '',
}
};
change方法
change(val) {
// console.log(val, 'valFu')
// val就是我們要的了
this.news = val;
},
這一步完成後,就會在頁面上看到編輯器的樣式啦~~
那麼怎麼釋出文章呢?
首先,定義一個方法
// 新增文章
fabu() {
// console.log(this.news,'news')
// 根據自己接口實際配置請求參數
let query = {
content: this.news,// 文章内容
// 還有包括類型、标題等等請自己配置
};
// console.log(query,'query')
// 這裡是添加的請求,例如,純手寫可能有錯
axios({
url:'',
method:'post',
data:query,
headers:{}
}).then(res =>{
// 看看傳回
console.log(res,'add news res')
});
},
然後點選觸發,當然一些驗證沒有做,請自行完善
<el-button type="primary" @click="fabu">新增</el-button>
最後,我們說一說回顯,元件内有回顯的處理,那麼怎麼觸發呢~
我的回顯操作,是在新聞清單頁面,需要幾步就能完成回顯
1、拿到新聞的文章内容
2、傳給子元件
這樣回顯就完成了,回顯後再編輯
3、給元件的@change事件定義方法,這個方法的主要目的就是,子元件内監聽内容變化
4、在剛剛定義的方法裡,将編輯内容重新指派給新聞的文章内容,(第一步)
5、在儲存按鈕上自定一個方法,向後端寫好的接口發送請求,最新的文章内容就是,第三步方法裡的文章内容
首先先看data:
data() {
return {
// 要回顯的新聞
updateone: {},
// 控制遮罩
maskindex: 1,
};
},
這是我的第一步,在新聞清單裡拿到完整新聞(scope.row)
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
type="text"
icon="el-icon-setting"
@click="showmask(scope.row)"
>修改</el-button
>
</template>
</el-table-column>
showmask:
showmask(row) {
// console.log(row, "row");
this.maskindex = 0;
this.updateone = row;
},
這樣就能打開我的遮罩層啦~,這裡是我再次引用了元件,如果直接看到這裡不明白的話,往上看看元件的使用就好了
<!-- 編輯mask -->
<div class="mask" v-show="maskindex == 0">
<div class="maskcon">
<div class="cotent">
<p style="magrin: 10px 0">内容:</p>
<div>
<editor-bar
v-model="detail"
:isClear="isClear"
<--這個注釋會報錯,删掉就行,這裡把文章的内容傳給了子元件-->
:contxt="updateone.content"
<--這個注釋會報錯,删掉就行,回顯完後再次編輯-->
@change="change"
></editor-bar>
</div>
</div>
再次編輯的chage事件:
change(val) {
// val:修改後的文章内容
this.updateone.content = val;
},
最後發送請求儲存下來就好啦