【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

这篇具有很好参考价值的文章主要介绍了【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:业务需求,要实现一个富文本框,好方便用户插入图片

问题:百度了一整天,看了n多文章包括官方文档,又花了半天时间实现需求,对于小白来说,真的是大难题,又着急,又害怕,结果就是,越急越搞不定……此处省略我的吐槽

来吧,上步骤:

一、安装富文本 wangEditor(参考官方文档)wangEditor

npm install wangeditor --save

我这里装的是版本4 (因为我折腾了半天的版本5 没搞出来)

二、在components文件夹下新建一个Vue文件,名字随便。参考:wangEditor.vue

把下面代码复制粘贴进去(图片上传部分还没完善好)

<template>
    <div>
        <div id="websiteEditorElem" style="height:300px;background: #ffffff;"></div>
    </div>
</template>

<script>
import E from 'wangeditor'
export default {
    name: "wangEditor",
    props: {
        content: "" //获取从父组件中传过来的值,主要用于修改的时候获取值,并加入到富文本框中
    },
    data() {
        return {
            phoneEditor: '',
            name: '',
        }
    },
    methods: {

    },
    mounted() {
        this.phoneEditor = new E('#websiteEditorElem')
        // 上传图片到服务器,base64形式
        this.phoneEditor.config.uploadImgShowBase64 = true
        // // 隐藏网络图片
        this.phoneEditor.config.showLinkImg = false;

        this.phoneEditor.config.debug = true;
        //图片上传接口
        this.phoneEditor.config.uploadImgServer = '' // 上传图片的接口地址
        this.phoneEditor.config.uploadFileName = 'image' // formdata中的name属性,比如现在是将图片image加入到formdate,后台从image中接收到图片数据
        this.phoneEditor.config.uploadImgHeaders = {
            token: sessionStorage.getItem("token") // 设置请求头
        }
        this.phoneEditor.config.uploadImgHooks = {
            customInsert: function (insertImg, result, editor) {
                console.log("成功", result);
                // before: function (xhr, editor, files) {
                //     // 图片上传之前触发
                //     // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件

                //     // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
                //     // return {
                //     //     prevent: true,
                //     //     msg: '放弃上传'
                //     // }
                // },
                // success: function (xhr, editor, result) {
                //     // 图片上传并返回结果,图片插入成功之后触发
                //     // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
                // },
                // fail: function (xhr, editor, result) {
                //     // 图片上传并返回结果,但图片插入错误时触发
                //     // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
                // },
                // error: function (xhr, editor) {
                //     // 图片上传出错时触发
                //     // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
                // },
                // timeout: function (xhr, editor) {
                //     // 图片上传超时时触发
                //     // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
                // },

                // // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
                // // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
                // customInsert: function (insertImg, result, editor) {
                //     // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
                //     // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果

                //     // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
                //     var url = result.url
                //     insertImg(url)

                //     // result 必须是一个 JSON 格式字符串!!!否则报错
                // }
            }
        }
        // 创建一个富文本编辑器
        this.phoneEditor.create()
        // 修改的时候,需要富文本内容回显,则需要加入以下代码
        this.phoneEditor.txt.html(this.content)

        this.phoneEditor.config.onchange = (html) => {
            this.info_ = html // 绑定当前逐渐地值
            this.$emit('change', this.info_) // 将内容同步到父组件中
        }
    },
}
</script>

步骤分解:

将内容同步到父组件中:

 this.phoneEditor.config.onchange = (html) => {
            this.info_ = html // 绑定当前逐渐地值
            this.$emit('change', this.info_) // 将内容同步到父组件中
        }

父组件中的获取方法是

<WangEdit @change="grtUrl" :content="editForm.content"></WangEdit>

@change="getUrl1"获取子组件中的数据,具体方法如下:

grtUrl(path){
            this.editForm.content = path;
        },

将子组件的数据加入到this.editForm.content中

修改内容时

需要富文本框中的数据回显,在子组件中加入

props:{
        content:"" //获取从父组件中传过来的值,主要用于修改的时候获取值,并加入到富文本框中
      },

三、从父组件中调用子组件时

完整代码:

<el-dialog title="修改培训信息" v-model="editWinVisible" width="45%" :before-close="handleClose" :center="false">
        <el-row class="dialog-detail">
            <el-col :span="5" class="dialog-detail-title">培训编号:</el-col>
            <el-col :span="19" class="dialog-detail-content">{{editForm.code}}</el-col>
            <el-col :span="5" class="dialog-detail-title">培训标题:</el-col>
            <el-col :span="19" class="dialog-detail-content">
                <el-input v-model="editForm.title" placeholder="请输入培训标题"></el-input>
            </el-col>
            <el-col :span="5" class="dialog-detail-title">培训内容:</el-col>
            <el-col :span="19" class="dialog-detail-content" >
                <WangEdit @change="grtUrl" :content="editForm.content"></WangEdit>
            </el-col>
            <el-col :span="5" class="dialog-detail-title">创建时间:</el-col>
            <el-col :span="19" class="dialog-detail-content">
                {{editForm.createDate}}
            </el-col>
        </el-row>
        <span slot="footer" class="dialog-footer">
            <el-button @click="CloseWin()">关闭</el-button>
            <el-button type="primary" @click="SaveEditData()">保存</el-button>
        </span>
    </el-dialog>
<script>
import WangEdit from '@/components/wangEditor.vue' //WangEditor在项目中的地址
import Req from '@/utils/ApiRequest'
export default{
    components:{ WangEdit },
    data(){
        return{
            editForm:{content:''},
            editWinVisible:false,
         }
    },
    methods:{
        grtUrl(path){
            this.editForm.content = path;
        },
        SaveEditData(){
            console.log('send',this.editForm)
            //下面这行代码就是控制页面显示是否带<p>标签的
            //this.editForm.content=this.editForm.content.replace(/<[^>]+>/g,"")
            Req.UpdateNews(this.editForm).then((res)=>{
                if(res.status==200)
                {
                    this.$message({type: 'success', message: '保存成功!'});
                    this.CloseWin();
                    this.GetTabData();
                }
                else{
                    this.$message({type: 'error', message: '保存失败!'});          
                }
            })
        },
    }
}

 富文本框就好了,数据也绑上了

【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

 注意:接下来,出现了一个bug,我在文本框里编辑后,页面绑定的数据神奇的带上了标签:

【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

 【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

 好了,接下来又是一顿百度,还好让我找到了

使用富文本quill-editor发送后台数据有标签问题<p>

【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

在点击确认提交的时候将富文本数据双向绑定的时候,添加  .replace(/<[^>]+>/g,"")

我是保存时,那么我的代码要做如下更改,加一行this.editForm.content=this.editForm.content.replace(/<[^>]+>/g,"")

​
 SaveEditData(){


            this.editForm.content=this.editForm.content.replace(/<[^>]+>/g,"")


            Req.UpdateNews(this.editForm).then((res)=>{
                if(res.status==200)
                {
                    this.$message({type: 'success', message: '保存成功!'});
                    this.CloseWin();
                    this.GetTabData();
                }
                else{
                    this.$message({type: 'error', message: '保存失败!'});          
                }
            })
        },

​

然后在标签中就可以直接展示了:

 <el-table-column prop="contentShow" label="培训内容" show-overflow-tooltip>
                </el-table-column>

【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

这里补充一下,还可以直接使用 v-html 具体方法,但是使用这个方法时,需要在如下场景使用里使用,直接在标签上绑定是不可以的,如:

  <el-col :span="6" class="dialog-detail-title">新闻标题:</el-col>
          <el-col :span="18" class="dialog-detail-content">{{ detailForm.title }}</el-col>
          <el-col :span="6" class="dialog-detail-title">新闻内容:</el-col>
          <el-col :span="18" class="dialog-detail-content">
               <div v-html="detailForm.content"></div>
          </el-col>
</el-col>

 【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

wangEditor4 加字数、空格,光标会跑到最后

问题复现:

【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

wangEditor在默认情况下,父组件给其设置内容后光标会处于首端,不符合需求。网上找的直接通过js操作的方法经过尝试没有作用(也可能是没写对),官方文档也没找到合适的方法。最终经过一番尝试后成功解决,特此记录,希望能帮到有类似需求的人。

解决:

在父组件与wangEditor通信的双向绑定数据value的watch方法中,增加一句:

this.editor.selection.moveCursor(this.editor.$textElem.elems[0],false);

 本来按照常见思路应该是放在聚焦监听函数onfocus中的,但是放在里面会报错:TypeError: Cannot read property ‘editor’ of undefined。如果放在onchange函数中倒是可以实现,不过会出现,光标先在前段显示,后跳到末尾的情况,总之放到value的watch方法中好。

watch: {
        value: function (value) {
            if (value !== this.phoneEditor.txt.html()) {
                this.phoneEditor.txt.html(this.value)    //根据父组件传来的值设置html值
            } this.phoneEditor.selection.moveCursor(this.phoneEditor.$textElem.elems[0], false);
        },                                               //value为编辑框输入的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值},
    },

 我是直接把上面watch里面的方法改写成如上

【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

 【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)

本文借鉴:Vue使用富文本quill-editor发送后台数据有标签问题: <p> - 简书 (jianshu.com)

wangEditor中使得光标处于文本末端的方法记录文章来源地址https://www.toymoban.com/news/detail-418290.html

到了这里,关于【更新】vue使用 wangeditor4 富文本 + 富文本回显带标签+wangEditor4 加字数,光标会跑到最后 问题 (已解决)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue wangeditor 富文本编辑器的使用

    wangeditor 富文本编辑器,是实现类似CSDN文章编辑功能的插件(CSDN官方使用的是CKEditor 富文本编辑器)。 wangEditor官方文档 根据自己项目使用的框架,采取不同的引入方式,如vue2: npm install @wangeditor/editor-for-vue --save 在vue2中使用wangeditor  (官方文档配置) 上例配置的效果:

    2024年02月14日
    浏览(45)
  • vue中使用wangeditor富文本编辑器

    官方文档  项目中要求实现富文本编辑器取编辑内容 这种编辑器有好多选择了wangeditor富文本编辑器 首先根据文档安装 再按照官方的指引 cv 如下代码 这个时候编辑器的功能已经实现了 如下图  但是目前为止他还不是我想要的 因为这个编辑器我想让他在弹窗中出现,而且我

    2023年04月26日
    浏览(48)
  • vue3 wangeditor/editor富文本使用和编辑

    第一步:安装 第二步:使用 最终效果图: 第四:工具栏配置 进入官方demo:https://www.wangeditor.com/demo/index.html 打开之后,按F12在控制台输入 toolbar.getConfig()  查看工具栏的默认配置。  如果有不需要的工具栏项,可以在  toolbarConfig.excludeKeys 中配置

    2024年01月21日
    浏览(50)
  • Vue3学习(二十)- 富文本插件wangeditor的使用

    学习、写作、工作、生活,都跟心情有很大关系,甚至有时候我更喜欢一个人独处,戴上耳机coding的感觉。 明显现在的心情,比中午和上午好多了,心情超棒的,靠自己解决了两个问题: 新增的时候点击 TreeSelect 控件控制台会给出报错 分类新增和编辑时,报错父类和电子书

    2024年03月09日
    浏览(39)
  • vue3项目使用富文本编辑器-wangeditor

    1.下载依赖 2.插件版本  3.使用 引入css和组件 配置方法 模板(标签)中插入 效果  

    2024年02月09日
    浏览(61)
  • Vue3 代码块高亮显示并可使用富文本编辑器编辑(highlight.js + wangEditor)

    在Vue项目中实现以下功能:   功能1. 在页面中显示代码,并将其中的高亮显示。   功能2. 允许对代码块进行编辑,编辑时代码也高亮显示。   功能3. 可在编辑器中添加多个代码块,动态渲染代码高亮。   Step1: 安装所需插件(本文使用npm安装,若需

    2023年04月21日
    浏览(46)
  • 基于Vue+wangeditor实现富文本编辑

    一个网站需要富文本编辑器功能的原因有很多,以下是一些常见的原因: 方便用户编辑内容:富文本编辑器提供了类似于Office Word的编辑功能,使得那些不太懂HTML的用户也能够方便地编辑网站内容。 提高用户体验:富文本编辑器注重用户体验,具有轻量、可定制等特点,使

    2024年02月14日
    浏览(42)
  • VUE2整合富文本编辑器 wangEditor

    2024年02月20日
    浏览(48)
  • vue2+wangEditor5富文本编辑器

    1、安装使用 安装 yarn add @wangeditor/editor # 或者 npm install @wangeditor/editor --save yarn add @wangeditor/editor-for-vue # 或者 npm install @wangeditor/editor-for-vue --save  在main.js中引入样式 import \\\'@wangeditor/editor/dist/css/style.css\\\'   在使用编辑器的页面引入js  import { Editor, Toolbar } from \\\"@wangeditor/editor-fo

    2024年01月22日
    浏览(50)
  • Vue组件封装:基于Vue3+wangeditor富文本组件二次封装

    1.简介         开源 Web 富文本编辑器,开箱即用,配置简单。一个产品的价值,就在于解决用户的问题,提高效率、降低成本、增加稳定性和扩展性。wangEditor 不是为了做而做,也不是单纯的模仿谁,而是经过上述问题分析之后,给出一个系统的解决方案。旨在真正去解决用

    2024年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包