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

【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"
    />
    <Editor
      v-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-ignore
  import { 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')
 
  // 编辑器实例,必须用 shallowRef
  const editorRef = shallowRef()
 
  // 内容 HTML
  const 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 变化,监听父组件传来的content
  watch(() => 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.value
      if (editor == null) return
      editor.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>


http://www.kler.cn/a/281701.html

相关文章:

  • 《Python编程实训快速上手》第七天--文件与文件路径
  • Vue 3与TypeScript集成指南:构建类型安全的前端应用
  • CSS遮罩:mask
  • LabVIEW 温湿度测试与监控系统
  • 联通光猫(烽火通信设备)改桥接教程
  • Windows docker下载minio出现“Using default tag: latestError response from daemon”
  • 【KDD2024】大数据基础工程技术集群异常检测论文入选
  • 【netty系列-08】深入Netty组件底层原理和基本实现
  • stable-diffusion-webui 部署 ,启用 api 服务
  • TPM管理培训究竟需要多少天?完整攻略在此
  • 光伏设计中组串逆变和微型逆变是什么意思?有什么区别?
  • 433 国乒启发式:一切方法的尽头都是本能反应
  • 提升广告效果:Facebook广告投放步骤与实用工具解析
  • GraphRAG论文阅读笔记
  • 构建开发全能型档期预约系统
  • spring整合redis(常用数据类型操作)
  • java 实现文本转音频
  • 线性代数 第三讲 线性相关无关 线性表示
  • vue之递归组件
  • 单例模式在实现webserver这个项目中起到了什么作用
  • 回调函数基本实现
  • 什么是跨域问题?出现的原因和解决方法是什么?
  • 自动化常用元素定位
  • pymysql 与 MySQL数据库交互
  • 程序员的自我修炼:如何拒绝快餐式学习,深耕技能20240829
  • windows消息机制之HMIsMarkDestroy宏定义的理解