首页 > 其他分享 >Vue3中使用富文本编辑器

Vue3中使用富文本编辑器

时间:2023-10-24 16:05:20浏览次数:42  
标签:文本编辑 vue const IDomEditor wangeditor Vue3 value editor 使用


在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中使用富文本编辑器_javascript

 

标签:文本编辑,vue,const,IDomEditor,wangeditor,Vue3,value,editor,使用
From: https://blog.51cto.com/u_15697128/8005191

相关文章

  • windows 在 PowerShell 中,可以使用 `Get-WindowsFeature` 命令来获取 Windows 功能的
    查询:在PowerShell中,可以使用Get-WindowsFeature命令来获取Windows功能的信息,包括已安装和可用的功能。以下是Get-WindowsFeature命令的一些常见参数:-Name:指定要获取的功能的名称。可以使用通配符来匹配多个功能,例如-NameWeb将匹配所有包含"Web"的功能。-Compute......
  • Jquery 下拉树下面是一个使用Combotree组件的简单案例:
    1、html <!DOCTYPEhtml><html><head><title>Combotree使用案例</title><linkrel="stylesheet"type="text/css"href="https://cdn.jsdelivr.net/npm/jquery-combotree/dist/jquery.combotree.min.css"......
  • 使用函数指针和信号槽函数情况比较
    函数指针的使用场景:C风格回调函数:当需要在C风格的API或库中使用回调函数时,函数指针非常有用。这允许您将函数指针传递给CAPI,以便在特定事件发生时调用您的函数。例如,Qt的一些底层模块可能需要与C库进行交互,这时函数指针是一个有用的工具。定时器:在Qt中,您可以使用QTimer类来触......
  • 【记录1】华为云-购买与使用软件管理 CentOS 7
     【记录一】华为云耀云服务器L实例-购买与使用软件管理 CentOS 7今天我们采用华为云耀云服务器L实例为例,介绍开始选配服务器到修改相关配置信息,到使用服务器管理软件进行服务管理,并上传文件到服务器中。https://www.huaweicloud.com/product/hecs-light.html1. 首先进......
  • 通过MySQL router连接MySQL8.0.23 Group Replication使用方式
    服务器信息:应用服务器:部署Myrouter,版本mysql-router-8.0.23-linux-glibc2.17-x86_64-minimal10.172.144.8810.172.144.89数据库服务器:部署MGR,版本mysql-8.0.23-linux-glibc2.17-x86_64-minimal10.172.144.6510.172.144.6610.172.144.671、MySQL8.0.23GroupReplication集群配置......
  • 无法使用systemctl启动uwsgi的坑
    使用uwsgi运行flask,无法使用systemctl设置service任务。正确设置了uwsgi.ini和service配置。使用systemctlstartxxx.service可以启动uwsgi进程,但service的状态一直是deactivate,然后过几秒钟直接结束uwsgi进程,serviceerror。直接说结论:删除uwsgi配置文件中设置日志用的daem......
  • C++_Cmake的使用
    C++系统版本、软件依赖版本、组件LSB(全称:LinuxStandardsBase)LSBsharedobjectELF是ExecutableLinkableFormat的缩写,是Linux的链接、可执行、共享库的格式标准,COFF:CommonObjectCOFF(通用对象文件格式) 编译器:简单构建gcc编译流程分为4个步骤,分......
  • 使用三方摄像头,实现pjsip的视频通话功能
    提要:近期一直在做视频通话功能,主要基于pjsip来实现的,将这些过程记录下来,可能对做同类型工作的同学有所帮助!实现思路,参考pjsip原来设备采集视频、编码并rtp组包发送的思路,再在原有流程中做修改!主要关键点:1、摄像头采集完成后已经是已编码的H264/H265的流,不需要再开启pjsip的编......
  • gitee与SourceTree的安装使用
    git可视化管理工具SourceTree安装教程:http://wed.xjx100.cn/news/174839.html?action=onClickgitee可视化管理工具SourceTree安装使用教程:https://blog.csdn.net/wan369282913/article/details/131858067这两篇文章结合着看,第一步下载git,第二步下载sourcetree,第三步用git生成公钥......
  • 土狗夹子机器人使用教程
    币圈量化夹子机器人使用步骤 第1步-在谷歌浏览器中设置MetaMask小狐狸钱包获取MetaMask小狐狸钱包地址:https://metamask.io/第2步-将币安智能链网络添加到MetaMask将BSC智能链添加到小狐狸钱包:第3步-打开Remix部署智能合约网站:https://remix.ethereum.org/......