Vue实现字符串中自定义标识符的解析渲染🎩

遇到难题,保持平常心,勇于面对,总会找出突破口。

前言

有这样一个场景: 实现了文字和图片的混输,此时div中有img标签文字,那么我们要将这些内容发送给服务端,然后服务端将我们发送的内容推送给每个用户,服务端需要什么格式的数据?我们客户端拿到服务端返回的数据,要怎么渲染到页面?接下来就给大家分享下我的解决方案,先给大家看一下最终实现的效果

image

实现思路

  • 监听回车事件
  • 获取输入框的所有子元素
  • 遍历所有子元素
  • 找出img标签和text节点
  • 获取img标签的alt标识,将alt标识解析成特定字符串
  • 调用接口发送最终解析好的字符串
  • 获取接口返回的数据,解析自定义标识符
  • 获取自定义标识符在字符串中出现的位置,将其解析成img标签
  • 渲染解析好的字符串

实现过程

  • 监听回车事件
<div class="input-panel" ref="msgInputContainer"@keydown.enter.exact="sendMessage($event)" contenteditable="true" spellcheck="false"></div>
  • 实现回车事件函数
sendMessage: function (event) {
        if (event.keyCode === 13) {
            // 阻止编辑框默认生成div事件
            event.preventDefault();
            let msgText = "";
            // 获取输入框下的所有子元素
            let allNodes = event.target.childNodes;
            for(let item of allNodes){
                // 判断当前元素是否为img元素
                if(item.nodeName==="IMG"){
                    msgText += `/${item.alt}/`;
                }
                else{
                    // 获取text节点的值
                    if(item.nodeValue!==null){
                        msgText += item.nodeValue;
                    }
                }
            }
            console.log("消息捕获成功:");
            console.info(msgText);
            // 接口调用,发送消息至服务端

                // 此处省略...

            //
            // 解析接口返回的数据进行渲染
            /**
             * 使用正则表达式解析特定字符串
             *     找到特定字符串出现的位置
             *     遍历配置文件中的json数据,
             *     判断当前关键字是否在配置文件中
             *     获取配置文件中的属性,生成img标签
             *     替换特定字符串为所生成的img标签
             * */
            let separateReg = /(\/[^/]+\/)/g;
            let finalMsgText = "";
            // 将符合条件的字符串放到数组里
            const resultArray = msgText.match(separateReg);
            if(resultArray!==null){
                for (let item of resultArray){
                    // 删除字符串中的/符号
                    item = item.replace(/\//g,"");
                    for (let emojiItem of this.emojiList){
                        // 判断捕获到的字符串与配置文件中的字符串是否相同
                        if(emojiItem.info === item){
                            const imgSrc = require(`../assets/img/emoji/${emojiItem.hover}`);
                            const imgTag = `<img src="${imgSrc}" width="28" height="28" alt="${item}">`;
                            // 替换匹配的字符串为img标签
                            finalMsgText = msgText.replace(separateReg,imgTag);
                        }
                    }
                }
            }else{
                finalMsgText = msgText;
            }
            console.log("消息解析成功:");
            console.log(finalMsgText);
            const thisSenderMessageObj = {
                "msgText": finalMsgText,
                "msgId": Date.parse(new Date()),
                "avatarSrc": require("../assets/img/avatar.jpg")
            };
            // 渲染页面
            this.senderMessageList.push(thisSenderMessageObj);
            // 清空输入框中的内容
            event.target.innerHTML = "";
        }
    },

踩坑记录

  • 使用removeChild()innerHTML删除可编辑div的子元素

    获取他的所有子元素,进行遍历删除,但是就是删不掉回车所产生的div,也不知道是不是自己写错了,有发现错误的朋友,欢迎评论区留言指正。

    let allNodes = event.target.childNodes;
     // 清空输入框中的内容
    for (let nodesItem of allNodes){
        event.target.removeChild(nodesItem);
    }
    
    // event.target.innerHTML = "";
    
image
  • 错误的正则表达式

    在渲染解析好的文字和图片的混输内容时,要将/图片描述/转成img标签,看了好久的正则表达式文档研究出的写法,看似没问题实则用不了。最后在群里求助,遇到了一个正则大佬,帮我改进了下,最终实现了我的需求

    // 我的正则
    let separateReg = /^\/.*\/$/g;
    // 大佬帮我改进的正则
    let separateReg = /(\/[^/]+\/)/g;    
    
  • 正确的删除可编辑div中的子元素

    先禁用掉可编辑div的回车生成div事件,然后清空输入框的内容
    javascript event.preventDefault(); event.target.innerHTML = "";

  • 正确解析字符串dom

    v-html的妙用
    html <p v-html="item.msgText"/>

写在最后

  • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
  • 本文首发于掘金,如需转载请评论区留言💌
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • 简述JavaScript起源起源于美国的Netscape公司,原名为LiveScript,后改为JavaScrip...
    3ab670b99521阅读 3,001评论 0 0
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,182评论 0 3
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,124评论 0 21
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,580评论 0 7
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,335评论 0 2