vue2使用富文本wangeditor场景

目录

1、富文本wangeditor

2、安装依赖

3、封装组件

4、使用组件

5、详情展示

 5.1 富文本只读展示

 5.2 只做内容展示


1、富文本wangeditor

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

2、安装依赖

根据自己使用镜像情况,用npm 或cnpm进行安装。

npm install wangeditor/editor
npm install wangeditor/editor-for-vue

安装后,package.json出现此依赖。 

3、 封装组件

 在项目组件路径下封装富文本组件components/wangeditor/index.vue ,方便其他页面引用

<template lang="html">
  <div >
    <div ref="editor" style="height: 410px">
    </div>
  </div>
</template>

<script>
import E from 'wangeditor'
export default {
  name: 'wang-editor',
  data() {
    return {
      editor: null,
      info_: null,
      // 配置富文本编辑器的菜单栏
      menu: [
        'undo', // 撤销
        'redo', // 重复
        'head', // 标题
        'bold', // 粗体
        'fontSize', // 字号
        'fontName', // 字体
        'italic', // 斜体
        'underline', // 下划线
        'strikeThrough', // 删除线
        'indent', // 缩进
        'lineHeight', // 行高
        'foreColor', // 文字颜色
        //'backColor', // 背景颜色
        'link', // 插入链接
        'list', // 列表
        'todo', // 待办
        'justify', // 对齐方式
        'quote', // 引用
        // 'emoticon', // 表情
        'image', // 插入图片
        // 'video', // 视频
        'table', // 表格
        'code', // 插入代码
        'splitLine' // 分割线
      ]
    }
  },
  model: {
    prop: 'value', // v-model 接收的值=props的message属性接收的值
    event: 'change' // v-model 发生变化时触发的方法
  },
  props: {
    value: { // 富文本数据
      type: String,
      default: ''
    },
    isClear: {
      type: Boolean,
      default: false
    },
    placeholder: { // placeholder 提示文字
      type: String,
      default: '请输入...'
    }

  },
  watch: {
    isClear(val) {
      // 触发清除文本域内容
      if (val) {
        this.editor.txt.clear()
        this.info_ = null
      }
    },
    value: function (value) {
      // 如果值不相等再进行赋值,避免多次赋值造成闪烁
      if (value !== this.editor.txt.html()) {
        this.editor.txt.html(this.value)
      }
    }
    // value为编辑框输入的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值
  },
  created() {
  },
  mounted() {
    this.seteditor()
    // 使用 editor.txt.html() 获取 html 。
    this.editor.txt.html(this.value)
  },
  beforeDestroy() {
    const editor = this.editor
    if (editor == null) return
    editor.destroy() // 组件销毁时,及时销毁编辑器
  },
  methods: {
    seteditor() {
      // 创建编辑器
      this.editor = new E(this.$refs.editor)
      this.editor.config.uploadImgShowBase64 = true // 使用 base64 格式保存图片。即,可选择本地图片,编辑器用 base64 格式显示图片。
      this.editor.config.uploadImgMaxSize = 1 * 1024 * 1024 // 将图片大小限制为 1MB
      this.editor.config.uploadImgMaxLength = 1 // 限制一次最多上传 1 张图片
      // 自定义 onchange 触发的延迟时间,默认为 200 ms
      this.editor.config.onchangeTimeout = 1000 // 单位 ms
      this.editor.config.menus = this.menu // 自定义菜单
      this.editor.config.placeholder = this.placeholder // placeholder 提示文字
      this.editor.config.onchange = (html) => {
        this.info_ = html // 绑定当前逐渐地值
        this.$emit('change', this.info_) // 将内容同步到父组件中
      }
      // 创建富文本编辑器
      this.editor.create()
    }
  }
}
</script>

<style >
.editor {
  width: 100%;
  height: 410px;
  margin: auto;
}
</style>

4、使用组件

主页面引用步骤3组件 

 使用组件

      <!--新增表单-->
      <el-dialog :title="titleName"  center :visible.sync="dialogVisible" width="65%" top="10px">
        <el-form  style="height: 550px" :model="addData" label-width="80px" :rules="rules3" ref="addData">
          <el-form-item label="名称:" prop="name">
            <el-input v-model="addData.name"></el-input>
          </el-form-item>
          <el-form-item label="内容:" :required="true">
            <wang-editor v-model="addData.content"  @change="changeText">
            </wang-editor>
          </el-form-item>
        </el-form>
        <div align="center" style="margin-top: 30px">
          <el-button @click="dialogVisible=false;addData.content ='';addData.name ='';addData.remark ='';">取消</el-button>
          <el-button v-if="titleName=='新增'" type="primary" @click="insertData('addData','1')">确定</el-button>
          <el-button v-if="titleName=='编辑'" type="primary" @click="insertData('addData','2')">确定</el-button>
        </div>
      </el-dialog>

名称、内容变量定义:  

addData: {
  id:'',
  name: '',
  content: '',
  submitPerson:'',
  remark:''
},

例如上面代码逻辑是,点击新增弹出富文本编辑弹框,效果如下:

可进行富文本内容编写,编辑和新增一样页面逻辑,不做赘述。

5、详情展示

 5.1 富文本只读展示

此方式会按照之前格式展示效果,通过属性设置成只读模式,对于表格效果很好。

      <el-dialog title="详情" center :visible.sync="dialogVisible2" width="65%" top="10px">
        <el-form :model="addData2" label-width="80px">
          <el-form-item label="名称:">
            <el-input :disabled="true" v-model="addData2.name"></el-input>
          </el-form-item>
          <el-form-item label="内容:">
            <wang-editor class="readOnlyEditor" v-model="addData2.content"></wang-editor>
          </el-form-item>
        </el-form>
        <div class="dialog-footer" align="center" style="margin-top: 5px">
          <el-button type="primary" @click="dialogVisible2=false">关闭</el-button>
        </div>
      </el-dialog>




<style scoped>
  .readOnlyEditor {
    pointer-events: none; /* 阻止鼠标事件 */
  }
</style>

 

 5.2 只做内容展示

此方式适合文字描述类文本,对于表格效果不是很好,具体使用哪种看需求。

      <el-dialog title="详情" center :visible.sync="dialogVisible2" width="65%" top="10px">
        <el-form :model="addData2" label-width="80px">
          <el-form-item label="名称:">
            <el-input :disabled="true" v-model="addData2.name"></el-input>
          </el-form-item>
          <el-form-item label="内容:">
            <div  style="max-height:1500px;min-height: 500px;overflow-y:auto;font-size: 16px !important;font-weight: normal!important;"
                  v-html="addData2.content">
            </div>
          </el-form-item>
        </el-form>
        <div class="dialog-footer" align="center" style="margin-top: 5px">
          <el-button type="primary" @click="dialogVisible2=false">关闭</el-button>
        </div>
      </el-dialog>

 5.3 数据表

数据字段类型为text就可以。

  `file_content` text COMMENT ' 文件内容',

 

### 如何在 Vue2 中解析富文本Vue2 项目中解析富文本通常涉及以下几个方面:通过 HTML 字符串渲染内容、使用第三方库增强功能以及处理安全性和交互需求。以下是详细的实现方法和注意事项。 #### 使用 `v-html` 渲染富文本 Vue 提供了内置指令 `v-html` 来绑定并渲染 HTML 字符串。这是最简单的方式之一,适用于仅需展示静态富文本的情况。 ```html <template> <div v-html="richTextContent"></div> </template> <script> export default { data() { return { richTextContent: `<p>这是一个<strong>加粗</strong>的段落。</p><ul><li>列表项1</li><li>列表项2</li></ul>` // 富文本字符串 }; } }; </script> ``` 需要注意的是,直接使用 `v-html` 可能存在 XSS 攻击风险[^1]。因此,在实际应用中应确保数据来源可信或对其进行必要的清理操作。 --- #### 集成富文本编辑器插件 如果需要更复杂的富文本编辑能力,则可以引入专门的富文本编辑器组件库。例如 **Quill Editor** 或者基于 CKEditor 的解决方案。 ##### 安装 Quill 编辑器依赖 可以通过 npm 安装 quill 和其对应的 Vue 封装包: ```bash npm install vue-quill-editor --save ``` ##### 实现示例代码 下面展示了如何配置并初始化一个简单的富文本编辑器实例: ```javascript import { Quill } from 'vue-quill-editor'; // 自定义工具栏选项 (可选) const toolbarOptions = [ ['bold', 'italic', 'underline'], [{ list: 'ordered' }, { list: 'bullet' }], ]; export default { components: { 'quill-editor': require('vue-quill-editor').default, }, data() { return { editorOption: { modules: { toolbar: toolbarOptions, // 工具栏设置 }, }, content: '', // 存储富文本内容 }; }, }; ``` 模板部分如下所示: ```html <template> <div> <!-- 富文本编辑区域 --> <quill-editor v-model="content" :options="editorOption"></quill-editor> <!-- 展示解析后的富文本 --> <div class="preview-area"> <h3>预览:</h3> <div v-html="content"></div> </div> </div> </template> ``` 此方式不仅能够满足基本的富文本显示需求,还提供了强大的编辑功能[^2]。 --- #### 动态生成 TOC(目录) 对于某些场景下可能还需要根据富文本中的标题结构来自动生成文章目录(Table of Contents)。这可通过正则表达式提取 H1 至 H6 标签的内容来完成。 假设我们已经获取到了一段完整的 HTML 文本作为输入源,那么可以用 JavaScript 处理这些标签节点。 ```javascript function generateToc(htmlString) { const tocItems = []; htmlString.replace(/<(h[1-6])>(.*?)<\/\1>/gi, function(match, tag, text){ let level = parseInt(tag.charAt(1)); tocItems.push({level, title:text.trim()}); }); return tocItems; } let sampleHtml = ` <h1>第一章</h1> <p>...</p> <h2>第一节</h2> `; console.log(generateToc(sampleHtml)); // 输出 [{"level":1,"title":"第一章"},{"level":2,"title":"第一节"}] ``` 上述逻辑可以直接移植至 Vue 数据模型更新过程中[^3]。 --- #### 图片上传与粘贴支持 当涉及到多媒体资源管理时,比如允许用户向富文本编辑区粘贴图片或将本地文件拖拽上传,就需要额外编写回调函数对接服务器端接口。 以下片段演示了一个典型的图片上传流程: ```javascript methods: { handleImageAdded(file, Editor, cursorLocation, resetUploader) { const formData = new FormData(); formData.append("image", file); axios({ url: "/api/upload-image", method: "POST", data: formData, }).then((result) => { const url = result.data.url; // 获取返回地址 Editor.insertEmbed(cursorLocation, "image", url); // 插入到编辑器光标处 resetUploader(); // 清除状态 }); }, } ``` 该过程利用 Axios 发送请求并将成功响应的结果注入回编辑框内[^4]。 --- ### 性能优化建议 为了提升用户体验,推荐采用按需加载策略减少初始页面体积;同时针对大型文档考虑分页机制避免一次性渲染过多 DOM 节点造成卡顿现象发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值