Vue3中使用富文本编辑器的示例详解

 更新时间:2023年10月20日 13:53:33   作者:会说法语的猪  
这篇文章主要为大家详细介绍了Vue3中使用富文本编辑器的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以参考一下

在vue3中我们可以使用@wangeditor/editor、@wangeditor/editor-for-vue来实现其功能

npm地址:https://www.npmjs.com/package/@wangeditor/editor-for-vue/v/5.1.12?activeTab=readme

官网:Editor 

1. 安装

pnpm add @wangeditor/editor
# 或者 npm install @wangeditor/editor --save
 
pnpm add @wangeditor/editor-for-vue@next
# 或者 npm install @wangeditor/editor-for-vue@next --save

2. 组件封装

@/comps/Editor/index.vue 

首先为了能让vue认识@wangeditor/editor-for-vue库、我们可以在.d.ts中声明一下即可

// 声明外部 npm 插件模块
declare module '@wangeditor/editor-for-vue';
<template>
  <div class="Wft-Editor flex flex-col">
    <Toolbar
      class="default-border"
      :editor="editorRef"
      :mode="mode"
    />
    <Editor
      class="flex-1 overflow-y-auto"
      v-model="valueHtml"
      :defaultConfig="editorConfig"
      :mode="mode"
      @onCreated="handleCreated"
      @onChange="onChange"
    />
  </div>
</template>
<script setup lang="ts">
import '@wangeditor/editor/dist/css/style.css'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import type { IDomEditor } from '@wangeditor/editor'
import { onBeforeUnmount, shallowRef, computed, watch } from 'vue'
 
type TProps = {
  mode?: string,
  valueHtml?: string,
  placeholder?: string,
  disable?: boolean
}
const props = withDefaults(defineProps<TProps>(), {
  mode: 'default', // or 'simple'
  valueHtml: '',
  placeholder: '请输入内容...',
  disable: false
})
type TEmits = {
  (e: 'update:valueHtml', params: string): void
  (e: 'update:valueText', params: string): void
  (e: 'onChange', params: IDomEditor): void
}
const emits = defineEmits<TEmits>()
 
const editorRef = shallowRef()
 
const valueHtml = computed({
  get() {
    return props.valueHtml
  },
  set(valueHtml) {
    emits('update:valueHtml', valueHtml)
  }
})
 
watch(() => props.disable, bool => {
  if(!editorRef.value) return
  bool ? (editorRef.value as IDomEditor).disable() : (editorRef.value as IDomEditor).enable()
}, { deep: true })
 
const editorConfig = computed(() => {
  return { placeholder: props.placeholder }
})
 
// 记录 editor 实例,重要!
const handleCreated = (editor: IDomEditor) => {
  editorRef.value = editor
}
 
// editor 改变
const onChange = (editor: IDomEditor) => {
  emits('onChange', editor)
}
 
// 销毁编辑器
onBeforeUnmount(() => {
  if(!editorRef.value) return
  editorRef.value.destroy()
})
 
function getHtml() {
  return (editorRef.value as IDomEditor).getHtml()
}
function getText() {
  return (editorRef.value as IDomEditor).getText()
}
defineExpose({ getHtml, getText })
</script>
<style scoped>
.Wft-Editor {
  width: 100%;
  height: 100%;
}
.flex {
  display: flex;
}
 
.flex-col {
  flex-direction: column;
}
 
.default-border {
  border-bottom: 1px solid #ccc;
}
 
.flex-1 {
  flex: 1;
}
 
.overflow-y-auto {
  overflow-x: hidden;
  overflow-y: auto;
}
</style>

3. 使用 

<template>
  <div class="wel">
    <div class="btn">
      <button @click="submit">提交</button>
      <button @click="getHtml">获取HTML</button>
      <button @click="getText">获取TEXT</button>
      <button @click="editorDisable = !editorDisable">{{ editorDisable ? '启用' : '禁用' }}</button>
    </div>
    <div class="editor-container">
      <Editor
        ref="EditorRef"
        :disable="editorDisable"
        v-model:value-html="editorValue"
        @on-change="editorChange"
      />
    </div>
  </div>
</template>
<script setup lang="ts">
import Editor from '@/comps/Editor/index.vue'
import { onMounted, ref, shallowRef } from 'vue'
import type { IDomEditor } from '@wangeditor/editor'
 
let editorValue = ref('') // 提交的数据
let editorDisable = ref(false)
let EditorRef = shallowRef<InstanceType<typeof Editor>>()
 
onMounted(() => {
  setTimeout(() => {
    editorValue.value = '<h1>回显测试</h1>'
  }, 3000)
})
 
const submit = () => {
  console.log(editorValue.value)
}
const getHtml = () => {
  console.log(EditorRef.value?.getHtml())
}
const getText = () => {
  console.log(EditorRef.value?.getText())
}
const editorChange = (editor: IDomEditor) => {
  console.log(editor.getHtml())
  console.log(editor.getText())
}
</script>
<style scoped>
.wel {
  width: 100%;
  height: 100%;
}
.btn {
  width: 100%;
  height: 40px;
  display: flex;
  align-items: center;
}
.btn button {
  margin-left: 15px;
}
.editor-container {
  width: 100%;
  height: calc(100% - 40px);
}
</style>

4. 效果 

到此这篇关于Vue3中使用富文本编辑器的示例详解的文章就介绍到这了,更多相关Vue3富文本编辑器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VUE获取Promise对象中PromiseResult中的数据(最新推荐)

    VUE获取Promise对象中PromiseResult中的数据(最新推荐)

    如果想要在接口请求方法的外面拿到请求的结果,再做相关数据处理,往往我们拿到的却是一个Promise对象,那么遇到这样的问题如何解决呢,下面小编给大家带来了VUE 项目中 如何获取Promise对象中的PromiseResult中的数据 ,感兴趣的朋友一起看看吧
    2023-10-10
  • vue-cli4.5.x快速搭建项目

    vue-cli4.5.x快速搭建项目

    vue-cli是一个官方发布vue.js项目脚手架,使用vue-cli可以快速创建vue项目。本文介绍了vue-cli4.5.x快速搭建项目,感兴趣的可以了解一下
    2021-05-05
  • vue 中的keep-alive实例代码

    vue 中的keep-alive实例代码

    这篇文章主要介绍了vue中的keep-alive实例代码,vue实现组件信息缓存的方法,在文中也给大家提到,需要的朋友可以参考下
    2018-07-07
  • vue3实现页面跳转的示例代码

    vue3实现页面跳转的示例代码

    这篇文章给大家介绍了vue3如何实现页面跳转,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • vue使用video插件vue-video-player详解

    vue使用video插件vue-video-player详解

    这篇文章主要为大家详细介绍了vue使用video插件vue-video-player,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • vue iview组件表格 render函数的使用方法详解

    vue iview组件表格 render函数的使用方法详解

    下面小编就为大家分享一篇vue iview组件表格 render函数的使用方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue上传图片组件编写代码

    vue上传图片组件编写代码

    这篇文章主要为大家详细介绍了vue上传图片组件的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • vue+element-ui表格封装tag标签使用插槽

    vue+element-ui表格封装tag标签使用插槽

    这篇文章主要介绍了vue+element-ui表格封装tag标签使用插槽,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Vue刷新修改页面中数据的方法

    Vue刷新修改页面中数据的方法

    今天小编就为大家分享一篇Vue刷新修改页面中数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue多页面配置详情

    vue多页面配置详情

    这篇文章主要介绍了vue多页面配置,单页应用这个概念,是随着前几年 AngularJS、React、Ember 等这些框架的出现而出现的。在前面的前言内容里,我们在页面渲染中讲了页面的局部刷新,而单页应用则是使用了页面的局部刷新的能力,下面来看看详细内容,需要的朋友可以参考一下
    2021-11-11

最新评论