wangeditor html编辑,Vue整合wangEditor富文本编辑器

最近在做项目时,客户有个发布新闻动态的功能,具体页面内容让客户自己编写,所以要选择富文本编辑器,这样用户体验好一点。网上有很多的富文本编辑器, 因为项目的功能并不是很复杂,所以选择了wangEditor,界面简洁,使用起来也挺方便的;

ba8abd50ab9d

image.png

实现思路

1.安装wangEditor

2.封装成组件

3.父组件中直接调用

一、wangEditor安装

这里使用npm命令安装;

npm install wangeditor

二、组件封装

2.1、创建组件

这里我们创建一个名为editor.vue的文件,并导入文件;

import E from "wangeditor"

2.2、初始化wangeditor

(1)我们创建一个初始化方法

(2)编写初始化代码

(3)在mounted()中调用

js代码

initE() {

this.editor = new E('#e')

//这里各位小伙伴可以查询官网,根据自己的需求进行菜单栏调整

this. editor.customConfig.menus = [

'head', // 标题

'bold', // 粗体

'fontSize', // 字号

'fontName', // 字体

'italic', // 斜体

'underline', // 下划线

'strikeThrough', // 删除线

'foreColor', // 文字颜色

'backColor', // 背景颜色

'link', // 插入链接

'list', // 列表

'justify', // 对齐方式

'quote', // 引用

'emoticon', // 表情

'image', // 插入图片

'table', // 表格

'code', // 插入代码

'undo', // 撤销

'redo' // 重复

]

this.editor.create()

},

mounted(){

this.initE()

}

2.3、配置图片上传

this.editor.customConfig.uploadFileName = 'file'

this.editor.customConfig.uploadImgServer = `url` // 你的服务器上传地址

this.editor.customConfig.uploadImgHooks = {

before: function (xhr, editor, files) {

// 图片上传之前触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件

// 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传

// return {

// prevent: true,

// msg: '放弃上传'

// }

},

success: function (xhr, editor, result) {

// 图片上传并返回结果,图片插入成功之后触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果

},

fail: function (xhr, editor, result) {

// 图片上传并返回结果,但图片插入错误时触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果

},

error: function (xhr, editor) {

// 图片上传出错时触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象

},

timeout: function (xhr, editor) {

// 图片上传超时时触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象

},

// 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置

// (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)

customInsert: function (insertImg, result, editor) {

// 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)

// insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果

// 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:

console.log(result.url)

var url = result.url

insertImg(url)

// result 必须是一个 JSON 格式字符串!!!否则报错

}

}

该代码需放置在this.editor = new E('#e') 和 this.editor.create()之间;

2.4、接收wangeditor接收值

this.editor.customConfig.onchange = (html) => {

this.info_ = html // 绑定当前逐渐地值

this.$emit('change', this.info_) // 将内容同步到父组件中

}

2.5、接收父组件传递过来的值

这里我们可以使用props属性指定字段来接收值,并使用model指定字段和事件

model: {

prop: 'desc',

event:'change'

},

props:{

desc:{

type:String,

default:""

},

//业务中我们经常会有添加操作和编辑操作,添加操作时,我们需清除上一操作留下的缓存

isClear:{

type:Boolean,

default:false

}

},

2.6、将父组件传递过来的值传入wangeditor

这里我们需要使用watch来监听值的变化,并进行赋值操作

watch:{

//判断用户是否清除编辑器缓存

isClear(val){

// console.log(val)

if (val){

this.editor.txt.clear()

}

},

//接收父组件传递过来的值

desc(value) {

//console.log("desc",value)

//判断父组件传递过来的值跟当前编辑器内容是否一样

if (value != this.editor.txt.html()) {

this.editor.txt.html(this.desc)

}

}

},

2.7、子组件代码汇总

import Vue from 'vue'

import E from "wangeditor"

export default {

name: 'editor',

data(){

return{

content:"",

editor: null,

info_:null

}

},

model: {

prop: 'desc',

event:'change'

},

watch:{

isClear(val){

// console.log(val)

if (val){

this.editor.txt.clear()

// this.info_=null

}

},

desc(value) {

//console.log("desc",value)

if (value != this.editor.txt.html()) {

this.editor.txt.html(this.desc)

}

}

},

props:{

desc:{

type:String,

default:""

},

//业务中我们经常会有添加操作和编辑操作,添加操作时,我们需清除上一操作留下的缓存

isClear:{

type:Boolean,

default:false

}

},

methods:{

initE(){

this.editor = new E('#e')

this.editor.customConfig.onchangeTimeout = 1000 // 单位 ms

this.editor.customConfig.uploadFileName = 'file'

this.editor.customConfig.uploadImgServer = `url` // 你的服务器地址

this.editor.customConfig.uploadImgHooks = {

before: function (xhr, editor, files) {

// 图片上传之前触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件

// 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传

// return {

// prevent: true,

// msg: '放弃上传'

// }

},

success: function (xhr, editor, result) {

// 图片上传并返回结果,图片插入成功之后触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果

},

fail: function (xhr, editor, result) {

// 图片上传并返回结果,但图片插入错误时触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果

},

error: function (xhr, editor) {

// 图片上传出错时触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象

},

timeout: function (xhr, editor) {

// 图片上传超时时触发

// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象

},

// 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置

// (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)

customInsert: function (insertImg, result, editor) {

// 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)

// insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果

// 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:

console.log(result.url)

var url = result.url

insertImg(url)

// result 必须是一个 JSON 格式字符串!!!否则报错

}

}

this.editor.customConfig.onchange = (html) => {

this.info_ = html // 绑定当前逐渐地值

this.$emit('change', this.info_) // 将内容同步到父组件中

}

this. editor.customConfig.menus = [

'head', // 标题

'bold', // 粗体

'fontSize', // 字号

'fontName', // 字体

'italic', // 斜体

'underline', // 下划线

'strikeThrough', // 删除线

'foreColor', // 文字颜色

'backColor', // 背景颜色

'link', // 插入链接

'list', // 列表

'justify', // 对齐方式

'quote', // 引用

'emoticon', // 表情

'image', // 插入图片

'table', // 表格

'code', // 插入代码

'undo', // 撤销

'redo' // 重复

]

this.editor.create()

// this.editor.txt.html(this.desc)

// this.editor.txt.html(this.desc)

}

},

mounted () {

this.initE();

}

}

三、父组件中进行调用

3.1、创建父组件,这里我们创建文件add-or-update.vue文件

(1)导入子组件

(2)在comonents中创建组件

(3)使用组件

import editor from './editor'

components: {

EDITOR: editor,

}

3.2、代码汇总

import editor from './editor'

export default {

components: {

EDITOR: editor

},

data () {

return {

content:"",

isClear: false//清除富文本编辑器内容

}

}

},

methods: {

}

}

富文本编辑器完成,快去撸起你代码~

<think>好的,我现在需要回答用户关于wangeditor富文本编辑器是否支持在线编辑HTML源文件的问题。首先,我要确认用户的具体需求:他们是否想在编辑器中直接查看和修改HTML源码?接下来,我需要查阅提供的引用资料,看看是否有相关的功能说明。 根据引用[2]提到,wangEditor v4版本没有内置的源码模式,但文档说明需要用户自己对接。引用[3]介绍了一个插件,可以为wangEditor扩展全屏和查看源码功能,但需要引入额外的CSS和JS文件,并调用初始化方法。引用[4]提到在wangEditor5中展示HTML时可能无样式,但可以通过Ctrl+U查看CSS文件,使用Prism.js实现代码高亮。不过,这里并没有明确说明是否支持在线编辑源码。 结合这些信息,我需要总结出:原生wangEditor不支持直接编辑HTML源码,但可以通过第三方插件或自定义开发实现。需要分版本讨论,v4和v5的情况可能不同。同时,引用[3]的插件可能只支持查看源码,而编辑功能可能需要进一步开发。此外,用户可能需要结合Monaco Editor等代码编辑器来增强功能,如引用[2]中的示例。最后,要确保回答结构清晰,引用正确的来源,并建议用户参考相关文档或社区资源。</think>关于 wangEditor 富文本编辑器对在线编辑 HTML 源码功能的支持情况,以下是详细说明: ### 1. 原生功能分析 wangEditor **原生未内置源码编辑模式**,其默认提供可视化富文本编辑界面。若直接查看或编辑 HTML 源码,需要通过以下方式实现: - **查看源码**:可通过插件扩展实现,如引用[3]提到的全屏插件包含源码查看功能,需引入`wangEditor-fullscreen-plugin.css`和`.js`文件,并调用`E.fullscreen.init('#editor')`[^3] - **编辑源码**:原生不支持直接修改源码,需自行对接代码编辑器(如 Monaco Editor),通过编程方式实现双向内容同步[^2] ### 2. 实现方案 #### 方案一:使用现有插件(仅查看) ```javascript // 引入全屏插件后初始化 var E = window.wangEditor; var editor = new E('#editor'); editor.create(); E.fullscreen.init('#editor'); // 此时工具栏会出现源码查看按钮 ``` #### 方案二:自定义源码编辑(需开发) 需结合代码编辑器库实现: 1. 添加切换按钮 2. 创建 Monaco Editor 实例 3. 建立双向数据绑定 ```vue <template> <div> <button @click="toggleMode">{{ mode }}模式</button> <div v-show="!isSourceMode" id="editor"></div> <div v-show="isSourceMode" id="code-editor"></div> </div> </template> <script> import MonacoEditor from 'monaco-editor'; export default { data() { return { isSourceMode: false, htmlContent: '' } }, methods: { toggleMode() { this.isSourceMode = !this.isSourceMode; if (this.isSourceMode) { this.monacoEditor.setValue(this.editor.txt.html()); } else { this.editor.txt.html(this.monacoEditor.getValue()); } } }, mounted() { // 初始化 wangEditor this.editor = new wangEditor('#editor'); this.editor.create(); // 初始化 Monaco Editor this.monacoEditor = MonacoEditor.create(document.getElementById('code-editor'), { value: '', language: 'html' }); } } </script> ``` ### 3. 版本差异说明 - **v4版本**:必须完全依赖插件或自定义开发[^2][^3] - **v5版本**:可通过`editor.getHtml()`获取源码,但直接编辑仍需自行实现界面[^4] ### 4. 注意事项 - 样式同步问题:从源码模式切回可视化编辑时,可能需要手动刷新 CSS 引用 - 代码高亮建议:使用 Prism.js 等库增强源码显示效果 - 数据安全:需对源码内容进行 XSS 过滤
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值