当前位置: 首页 > news >正文

【vue3】wangEditor 5在vue3中的使用

实现效果:

将wangEditor富文本编辑器进行封装,父组件可以使用子组件富文本编辑器中的数据用于api对接。

1.安装


官网:https://www.wangeditor.com

# Vue2 安装
yarn add @wangeditor/editor-for-vue
# 或者 npm install @wangeditor/editor-for-vue --save# Vue3 安装
yarn add @wangeditor/editor-for-vue@next
# 或者 npm install @wangeditor/editor-for-vue@next --save

2.创建编辑器vue文件

commonEdit.vue

<template><div style="border: 1px solid #ccc"><Toolbar:editor="editorRef":defaultConfig="toolbarConfig":mode="mode"style="border-bottom: 1px solid #ccc"/><Editorv-model="valueHtml":defaultConfig="editorConfig":mode="mode"@onCreated="handleCreated"@onChange="handleChange"style="height: 500px; overflow-y: hidden;"/></div>
</template><script setup lang="ts">import { watch,onBeforeUnmount,nextTick, ref, shallowRef, onMounted,onBeforeMount } from 'vue'//@ts-ignoreimport { Editor, Toolbar } from '@wangeditor/editor-for-vue'import '@wangeditor/editor/dist/css/style.css' // 引入 css// Props:使用属性,子组件接收父组件传递的内容const props = defineProps({content: { type: String, default: '' }})// Emits:使用事件,将子组件内容传递给父组件。父组件使用 update(content: string) const emit = defineEmits<{ (e: 'update', content: string): void }>()const mode = ref('default')// 编辑器实例,必须用 shallowRefconst editorRef = shallowRef()// 内容 HTMLconst valueHtml = ref('')const toolbarConfig = {}const editorConfig = { placeholder: '请输入内容...' ,MENU_CONF:{} as any}// 上传图片配置editorConfig.MENU_CONF['uploadImage'] = {// form-data fieldName ,默认值 'wangeditor-uploaded-image'。传给后端接口的参数名,重要!fieldName: 'file',server: 'http://localhost:8080/files/wangEditorUpload'}const handleCreated = (editor:any) => {editorRef.value = editor // 记录 editor 实例,重要!}const handleChange = () => { valueHtml.value  = editorRef.value.getHtml()emit('update', valueHtml.value) }// 监听 props 变化,监听父组件传来的contentwatch(() => props.content, (newVal:string) => {nextTick(() => {if (editorRef.value) {// console.log(" 当前编辑器的状态:", editorRef.value); // 富文本编辑器按 html 格式回显editorRef.value.setHtml(newVal)valueHtml.value = newVal}})})onMounted(async() => {await nextTick(); // 延迟渲染,确保 DOM 更新完成if(props.content) {valueHtml.value = props.content }})// 组件销毁时,也及时销毁编辑器onBeforeUnmount(() => {const editor = editorRef.valueif (editor == null) returneditor.destroy()})</script>

3.父组件中引用

<template><el-form :model="form" label-width="auto" style="max-width: 800px"><el-form-item label="文章标题"><el-input v-model="form.title" /></el-form-item><el-form-item label="文章内容"><commonEdit :content="form.html" @update="update"/></el-form-item><el-form-item label="文章简介"><el-input v-model="form.desc" type="textarea" /></el-form-item><el-form-item><el-button type="primary" @click="onSubmit(form)">提交</el-button><el-button>取消</el-button></el-form-item></el-form>
</template><script lang="ts" setup>
import commonEdit from '../components/commonEdit.vue';
import { reactive } from 'vue'
import { addArticle } from '../api';
import router from '../router';
// do not use same name with ref
const form = reactive({title: '',desc: '',html:'',
})const onSubmit = (data:any) => {console.log(data);addArticle(data)router.push('/article')
}// 更新富文本编辑器内容const update = (content:string) => {form.html=content};</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于my Batis优化图书管理系统(总)
  • 【搜索引擎】ElasticSearch 7.x版本
  • ACL基础笔记
  • ceph-rgw zipper的设计理念(1)
  • ARCGIS 纸质小班XY坐标转电子要素面(2)
  • validationtools中按键测试选项光标移除
  • Spring Boot集成Stripe快速入门demo
  • 使用dx工具将jar和class打包成dex
  • 注解的生命周期
  • 粘包、半包和Netty中的自定义帧解码器间的关系
  • 【Java设计模式】脏标记模式:通过变更跟踪优化性能
  • HTTP/3
  • 453.最小操作次数使数组元素相等
  • 产品概述Tektronix泰克TCP0030A电流探头TCP0030原装二手
  • 自然语言处理与深度学习的结合
  • SegmentFault for Android 3.0 发布
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • avalon2.2的VM生成过程
  • export和import的用法总结
  • Git的一些常用操作
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • log4j2输出到kafka
  • Map集合、散列表、红黑树介绍
  • Vue 2.3、2.4 知识点小结
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前端临床手札——文件上传
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 怎么把视频里的音乐提取出来
  • 追踪解析 FutureTask 源码
  • FaaS 的简单实践
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​ubuntu下安装kvm虚拟机
  • ​zookeeper集群配置与启动
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #nginx配置案例
  • #WEB前端(HTML属性)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (42)STM32——LCD显示屏实验笔记
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C11) 泛型表达式
  • (pytorch进阶之路)扩散概率模型
  • (第30天)二叉树阶段总结
  • (三)c52学习之旅-点亮LED灯
  • (十八)SpringBoot之发送QQ邮件
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)原始图像数据和PDF中的图像数据
  • (自用)交互协议设计——protobuf序列化
  • **CI中自动类加载的用法总结
  • **PHP二维数组遍历时同时赋值
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版