You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.3 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div ref="editorRef" />
</template>
<script lang="ts">
import { defineComponent, ref, onMounted, onBeforeUnmount, unref, watch } from 'vue'
import { editorProps } from './props'
import E from 'wangeditor'
import hljs from 'highlight.js'
import 'highlight.js/styles/monokai-sublime.css'
export default defineComponent({
name: 'Editor',
props: editorProps,
emits: ['change', 'focus', 'blur', 'update:value'],
setup(props, { emit }) {
const editorRef = ref<HTMLElement | null>(null)
const editor = ref<E | null>(null)
onMounted(() => {
createdEditor()
})
onBeforeUnmount(() => {
if (editor.value) {
editor.value.destroy()
editor.value = null
}
})
watch(
() => props.value,
(value: string) => {
if (editor.value) {
editor.value.txt.html(value)
}
},
{
immediate: true
}
)
function createdEditor(): void {
editor.value = new E(unref(editorRef) as any)
initConfig(editor.value)
editor.value.create()
editor.value.txt.html(props.value)
}
function initConfig(editor: any): void {
const {
height,
zIndex,
placeholder,
focus,
customAlert,
menus,
colors,
fontNames,
lineHeights,
showFullScreen,
onchangeTimeout
} = props.config
// 设置编辑区域高度为 500px
editor.config.height = height
// 设置zIndex
editor.config.zIndex = zIndex
// 设置 placeholder 提示文字
editor.config.placeholder = placeholder
// 设置是否自动聚焦
editor.config.focus = focus
// 配置菜单
editor.config.menus = menus
// 配置颜色(文字颜色、背景色)
editor.config.colors = colors
// 配置字体
editor.config.fontNames = fontNames
// 配置行高
editor.config.lineHeights = lineHeights
// 代码高亮
editor.highlight = hljs
// 配置全屏
editor.config.showFullScreen = showFullScreen
// 编辑器 customAlert 是对全局的alert做了统一处理默认为 window.alert。
// 如觉得浏览器自带的alert体验不佳可自定义 alert以便于达到与自身项目统一的alert效果。
editor.config.customAlert = customAlert
// 图片上传默认使用base64
editor.config.uploadImgShowBase64 = true
// 配置 onchange 回调函数
editor.config.onchange = (html: string) => {
const text = editor.txt.text()
emitFun(editor, html, 'change')
emit('update:value', props.valueType === 'html' ? html : text)
}
// 配置触发 onchange 的时间频率,默认为 200ms
editor.config.onchangeTimeout = onchangeTimeout
// 编辑区域 focus聚焦和 blur失焦时触发的回调函数。
editor.config.onblur = (html: string) => {
emitFun(editor, html, 'blur')
}
editor.config.onfocus = (html: string) => {
emitFun(editor, html, 'focus')
}
}
function emitFun(editor: any, html: string, type: 'change' | 'focus' | 'blur'): void {
const text = editor.txt.text()
emit(type, props.valueType === 'html' ? html : text)
}
return {
editorRef
}
}
})
</script>
<style>
</style>