wangEditor富文本封装成vue组件


安装

用于 Vue React | wangEditor

子组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<style src="@wangeditor/editor/dist/css/style.css"></style>
<template>
<div style="border: 1px solid #ccc;">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editor"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<Editor
style="height: 500px; overflow-y: hidden;"
v-model="html"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="onCreated"
@onChange="onChange"
/>
</div>
</template>
<script>
import Vue from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import {getAccessToken} from "@/utils/auth";

export default Vue.extend({
props: { // 1. props 的 name 进行接收
value: {
default: ''
}
},
components: { Editor, Toolbar },
data() {
return {
editor: null,
html: this.value,
currentValue: '',
toolbarConfig: { },
editorConfig: {
placeholder: '请输入内容...',
MENU_CONF: {
//上传参考https://www.wangeditor.com/v5/menu-config.html#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE
uploadImage: {
server: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload2", // 请求地址
// 超时时间,默认为 10 秒
timeout: 30 * 1000, // 5s
fieldName: "file",
// 将 meta 拼接到 url 参数中,默认 false
metaWithUrl: false, // join params to url
// 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
meta: { dataKey: 0, bizType: "common" },
// 自定义增加 http header
headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部
// 跨域是否传递 cookie ,默认为 false
withCredentials: true,
// 自定义增加 http header
// headers: {
// Accept: "text/x-json",
// otherKey: "xxx"
// },
maxFileSize: 10 * 1024 * 1024, // 10M
base64LimitSize: 5 * 1024, // insert base64 format, if file's size less than 5kb
// 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
allowedFileTypes: ["image/*"],
// 最多可上传几个文件,默认为 100
maxNumberOfFiles: 30,
onBeforeUpload(file) {
console.log("onBeforeUpload", file);

return file; // will upload this file
// return false // prevent upload
},
onProgress(progress) {
console.log("onProgress", progress);
},
onSuccess(file, res) {
console.log("onSuccess", file, res);
},
onFailed(file, res) {
alert(res.message);
console.log("onFailed", file, res);
},
onError(file, err, res) {
alert(err.message);
console.error("onError", file, err, res);
}
},
uploadVideo: {
server: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload2", // 请求地址
fieldName: "file",
// 单个文件的最大体积限制,默认为 10M
maxFileSize: 5 * 1024 * 1024, // 5M
// 最多可上传几个文件,默认为 5
maxNumberOfFiles: 3,
// 选择文件时的类型限制,默认为 ['video/*'] 。如不想限制,则设置为 []
allowedFileTypes: ["video/*"],
// 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
meta: { dataKey: 0, bizType: "video" },
// 将 meta 拼接到 url 参数中,默认 false
metaWithUrl: false,
// 自定义增加 http header
headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部
// 跨域是否传递 cookie ,默认为 false
withCredentials: true,
// 超时时间,默认为 30 秒
timeout: 30 * 1000, // 15 秒
// 上传进度的回调函数
onProgress(progress) {
console.log("progress", progress);
},
// 单个文件上传成功之后
onSuccess(file, res) {
console.log(`${file.name} 上传成功`, res);
},
// 单个文件上传失败
onFailed(file, res) {
console.log(`${file.name} 上传失败`, res);
},
// 上传错误,或者触发 timeout 超时
onError(file, err, res) {
console.log(`${file.name} 上传出错`, err, res);
}
}
}
},
mode: 'default', // or 'simple'
}
},
watch: {
value: {
handler(val) {
if (val !== this.html) {
this.html = val === null ? "" : val;
if (this.editor) {
this.editor.setHtml(this.html);
}
}
},
immediate: true,
},
},
methods: {
onCreated(editor) {
this.editor = Object.seal(editor)
},
onChange(editor) {
const html = editor.getHtml()
this.$emit("echoHtml", html); // 1. $emit 方法,通知 ok 事件,message 是参数
// 也可以同步到 <textarea>
}
},
mounted() {
// 模拟 ajax 请求,异步渲染编辑器
// setTimeout(() => {
// this.html = props.dd
// }, 1500)
},
beforeDestroy() {
this.editor = null;
}
})
</script>

父容器+使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<el-form-item label="描述">
<editor v-model="form.description" @echoHtml="echoHtml" :min-height="192"/> <!--使用$emit通过echoHtml监听回显数据-->
</el-form-item>

import Editor from '@/components/Editor';
<script>
export default {
name: "Test",
components: {
Editor
},
data() {
return {

};
},
created() {

},
methods: {
echoHtml(html) { // 声明 echoHtml 方法,监听 echoHtml 自定义事件
this.form.description = html;
}
}
};
</script>