前端实现仿微博@功能(tributejs)&&qrcode根据url转换成二维码

首先说下我们的业务场景

我们目前有三个平台 分别是淘宝抖音快手(搞数据爬虫的),看了一下微博的大概发布逻辑,微博是前端给后端一个@马总 或者 #马总真棒# 后端把它转成标签的格式例如 ``<a href='www,mazong,com'>马总</href>`没有的话则创建一个话题,前端只需要读取就可 但是我们这个不可以这样做 因为我们有三个平台 如果直接给后端传一个名字,并不知道用户想要的哪个平台的名字,跳转的话就会有bug,所以这就需要前端来处理;下面开始说一下如何实现。

首先插件是使用的"tributejs": "^5.1.3", 附git链接:https://github.com/zurb/tribute。(注:还有一些bug作者没有解决,详情见issues)

然后和后台沟通好怎么传输 我们是这个格式 #薇娅#[69226163,taobao] 返回的时候也是这个格式然后自己前端处理一下渲染出来。

里面有一个trigger是触发器 就是触发下拉框的一个事件

[图片上传失败...(image-3e5e3d-1607570108175)]

selectTemplate是点击确定以后渲染到页面的格式 例如我是这样写的:

selectTemplate: function (item) {
    if (this.range.isContentEditable(this.current.element)) {
        let tpl = `<a href="javascript:void(0)" 
                    name='${item.original.anchorNickname}'
                    id='${item.original.anchorId}'
                    plantfrom='${item.original.anchorPlatform}'
                    style='color: #FF6B60'
                    contenteditable='true'  target="_blank">
                            #${item.original.anchorNickname}#</a>`
        return tpl
    }
},

menuItemTemplate是下拉框的一些样式:

 menuItemTemplate: function (item) {
        return `<div class="menuItem" @click="mx">
                    <em>${item.original.anchorNickname}</em> 
                    <em>粉丝: ${ that.formatNum(item.original.anchorLatestFansNums)}</em> 
                    <span class="${item.original.anchorPlatform == 'kuaishou'?'kuaishou' : (item.original.anchorPlatform == 'douyin' ?'douyin':'taobao')}" >
                        ${item.original.anchorPlatform == 'kuaishou'? '快手平台' : (item.original.anchorPlatform == 'douyin'? '抖音平台' : '淘宝平台') }
                    </span> 
                </div>`
    },

当然还有一些其他的一些配置

例如:

replaceTextSuffix 回车确认以后尾随的值

noMatchTemplate 没有搜索到时显示的文案undefinedlookup 搜索时选择的参数

values数据

values: [{ key: "Phil Heartman", value: "pheartman" },{ key: "Gordon Ramsey", value: "gramsey" } ] 可以填写默认值 也可以写请求方法请求的数据。
接下来会有小伙伴说了,啊 那他是怎么知道我的输入框在哪里的?别着急,看这里-> this.$nextTick(()=>{
tribute.attach(document.querySelectorAll(".mentionable"));// 绑定你所需要的div的class名字
})

接下来样式写完了 开始连接跟后台的api;

var tribute = new Tribute({
    values: (text, cb)=> {
        this.remoteSearch(text, users => cb(users));
    }
})

/********************************/

methods:{
    remoteSearch (text, cb) {
                this.text = text;
                if(!text){
                    return;
                }
                if(this.time){//节流防抖
                    this.time = false
                    setTimeout(()=>{
                        this.search_anchor(this.text, cb)
                        this.time = true;
                    },2000)
                }
            },
}

功能到这里其实差不多了,但是我们还有一个点击下面的按钮 添加一个#其实就跟微博@一样,点击会在文本框里添加一个#或者@。(目前无法实现根据上次光标的地方点击插入进去)

image.png

给需要触发的div绑定事件insertVariable(将文本框原本的内容和#做拼接)

insertVariable(value){ //在textarea的光标处插入置顶文字
                var sel = this.$refs.gain;
                sel.innerHTML += " #";
                var range = window.getSelection();
                range.selectAllChildren(sel);
                range.collapseToEnd();
            }

直接这样写是可以尾部插入一个# 但是有一系列的问题 比如换行等 一系列神奇的bug

优化代码如下:

insertVariable(value){ //在textarea的光标处插入置顶文字
    var sel = this.$refs.gain;
    if(sel.innerHTML == '<br>'){ //解决莫名其妙换行问题 (里面数据为空时会塞入一个br  没有找到原因)
        sel.innerHTML = " #";
    }else{
        sel.innerHTML += " #";
    }
    var range = window.getSelection();
    range.selectAllChildren(sel);
    range.collapseToEnd();
},

成功解决~;

接下来如何渲染呢;

别着急,上代码!

htmlShow(){
    var reg = /#([^#]+?)#\[(.+?),(.+?)\]/g;
    var str = this.content;
    if(!this.content){
        return;
    } else if(!str.match(reg)){
        this.htmlInner = str;
        return;
    }
    var repe = str.replace(reg, function (a, b, c, d) {
        var name = a.split("#[");
        var platform = (name[1].split(",")[1].split("]")[0]).trim();
        var id = name[1].split(",")[0];
        if(platform == 'taobao'){
            return `<span><a href='/taobao/anchorModel/searchAnchor/anchor-detail/${id}' style='color: #FF5353;text-decoration:none;'> ${name[0]}# </a></span>`;
        } else if(platform == 'kuaishou'){
            return `<span><a href='/kuaishou/anchor/anchor-detail/${id}' style='color: #FF5353;text-decoration:none;'> ${name[0]}# </a></span>`;
        } else if(platform == 'douyin'){
            return `<span><a href='/douyin/anchor/anchor-detail/${id}' style='color: #FF5353;text-decoration:none;'> ${name[0]}# </a></span>`;
        }else{
            return ''
        }
    });
    this.htmlInner = repe;
    }  

使用正则配合来筛选出所有的带#xxx#xxx,xxxx 的格式然后使用字符串拼接起来把数据return出去就可以了。

发布文章可以啦,接下来还有一个需求是分享发布到微博和朋友圈,

分享微博的话直接用https://service.weibo.com/share/share.php?url=分享地址?&sharesource=weibo&title=分享内容 拼接即可 使用npm包来引入 qrcode ,返回的参数里面第二个参数就是返回的base64

var url = `http://beta2.dev.pangqiu.com/omni/content-details/${item.articleId}`
                QRCode.toDataURL(url, (err, url) => {
                    if(!err){
                        this.imgUrl = url;
                    }
                })

转换成功

image.png

里面有好多坑 踩了一个星期,才算搞完,头皮发麻。

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

推荐阅读更多精彩内容