利用VUE+elementUI实现评论、回复评论,评论展示功能

5 篇文章 0 订阅
订阅专栏

原文链接:https://blog.csdn.net/zLanaDelRey/article/details/100997792

毕设需要,实现评论展示,评论,回复评论等功能。发现一个可用并非常合适的博客,故转载!

效果:

回复评论:

 

上代码:

html

<template>
    <div>
        <div v-clickoutside="hideReplyBtn" @click="inputFocus" class="my-reply">
            <el-avatar class="header-img" :size="40" :src="myHeader"></el-avatar>
            <div class="reply-info" >
                <div 
                tabindex="0" 
                contenteditable="true" 
                id="replyInput" 
                spellcheck="false" 
                placeholder="输入评论..." 
                class="reply-input" 
                @focus="showReplyBtn"  
                @input="onDivInput($event)"
                >
                </div>
            </div>
            <div class="reply-btn-box" v-show="btnShow">
                <el-button class="reply-btn" size="medium" @click="sendComment" type="primary">发表评论</el-button>
            </div>
        </div>
        <div v-for="(item,i) in comments" :key="i" class="author-title reply-father">
            <el-avatar class="header-img" :size="40" :src="item.headImg"></el-avatar>
            <div class="author-info">
                <span class="author-name">{{item.name}}</span>
                <span class="author-time">{{item.time}}</span>
            </div>
            <div class="icon-btn">
                <span @click="showReplyInput(i,item.name,item.id)"><i class="iconfont el-icon-s-comment"></i>{{item.commentNum}}</span>
                <i class="iconfont el-icon-caret-top"></i>{{item.like}}
            </div>
            <div class="talk-box">
                <p>
                    <span class="reply">{{item.comment}}</span>
                </p>
            </div>
            <div class="reply-box">
                <div v-for="(reply,j) in item.reply" :key="j" class="author-title">
                    <el-avatar class="header-img" :size="40" :src="reply.fromHeadImg"></el-avatar>
                    <div class="author-info">
                        <span class="author-name">{{reply.from}}</span>
                        <span class="author-time">{{reply.time}}</span>
                    </div>
                    <div class="icon-btn">
                        <span @click="showReplyInput(i,reply.from,reply.id)"><i class="iconfont el-icon-s-comment"></i>{{reply.commentNum}}</span>
                        <i class="iconfont el-icon-caret-top"></i>{{reply.like}}
                    </div>
                    <div class="talk-box">
                        <p>
                            <span>回复 {{reply.to}}:</span>
                            <span class="reply">{{reply.comment}}</span>
                        </p>
                    </div>
                    <div class="reply-box">

                    </div>
                </div>
            </div>
            <div  v-show="_inputShow(i)" class="my-reply my-comment-reply">
                <el-avatar class="header-img" :size="40" :src="myHeader"></el-avatar>
                <div class="reply-info" >
                    <div tabindex="0" contenteditable="true" spellcheck="false" placeholder="输入评论..."   @input="onDivInput($event)"  class="reply-input reply-comment-input"></div>
                </div>
                <div class=" reply-btn-box">
                    <el-button class="reply-btn" size="medium" @click="sendCommentReply(i,j)" type="primary">发表评论</el-button>
            </div>
        </div>
        </div>
    </div>
</template>

java script 

<script>
const clickoutside = {
    // 初始化指令
    bind(el, binding, vnode) {
    function documentHandler(e) {
    // 这里判断点击的元素是否是本身,是本身,则返回
        if (el.contains(e.target)) {
            return false;
        }
    // 判断指令中是否绑定了函数
        if (binding.expression) {
            // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
            binding.value(e);
        }
    }
    // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
    el.vueClickOutside = documentHandler;
    document.addEventListener('click', documentHandler);
    },
    update() {},
    unbind(el, binding) {
    // 解除事件监听
    document.removeEventListener('click', el.vueClickOutside);
    delete el.vueClickOutside;
  },
};
export default {
    name:'ArticleComment',
    data(){
        return{
            btnShow: false,
            index:'0',
            replyComment:'',
            myName:'Lana Del Rey',
            myHeader:'https://ae01.alicdn.com/kf/Hd60a3f7c06fd47ae85624badd32ce54dv.jpg',
            myId:19870621,
            to:'',
            toId:-1,
            comments:[
                {
                    name:'Lana Del Rey',
                    id:19870621,
                    headImg:'https://ae01.alicdn.com/kf/Hd60a3f7c06fd47ae85624badd32ce54dv.jpg',
                    comment:'我发布一张新专辑Norman Fucking Rockwell,大家快来听啊',
                    time:'2019年9月16日 18:43',
                    commentNum:2,
                    like:15,
                    inputShow:false,
                    reply:[
                        {
                            from:'Taylor Swift',
                            fromId:19891221,
                            fromHeadImg:'https://ae01.alicdn.com/kf/H94c78935ffa64e7e977544d19ecebf06L.jpg',
                            to:'Lana Del Rey',
                            toId:19870621,
                            comment:'我很喜欢你的新专辑!!',
                            time:'2019年9月16日 18:43',
                            commentNum:1,
                            like:15,
                            inputShow:false
                        },
                        {
                            from:'Ariana Grande',
                            fromId:1123,
                            fromHeadImg:'https://ae01.alicdn.com/kf/Hf6c0b4a7428b4edf866a9fbab75568e6U.jpg',
                            to:'Lana Del Rey',
                            toId:19870621,
                            comment:'别忘记宣传我们的合作单曲啊',
                            time:'2019年9月16日 18:43',
                            commentNum:0,
                            like:5,
                            inputShow:false

                        }
                    ]
                },
                {
                    name:'Taylor Swift',
                    id:19891221,
                    headImg:'https://ae01.alicdn.com/kf/H94c78935ffa64e7e977544d19ecebf06L.jpg',
                    comment:'我发行了我的新专辑Lover',
                    time:'2019年9月16日 18:43',
                    commentNum:1,
                    like:5,
                    inputShow:false,
                    reply:[
                        {
                            from:'Lana Del Rey',
                            fromId:19870621,
                            fromHeadImg:'https://ae01.alicdn.com/kf/Hd60a3f7c06fd47ae85624badd32ce54dv.jpg',
                            to:'Taylor Swift',
                            toId:19891221,
                            comment:'新专辑和speak now 一样棒!',
                            time:'2019年9月16日 18:43',
                            commentNum:25,
                            like:5,
                            inputShow:false

                        }
                    ]
                },
                {
                    name:'Norman Fucking Rockwell',
                    id:20190830,
                    headImg:'https://ae01.alicdn.com/kf/Hdd856ae4c81545d2b51fa0c209f7aa28Z.jpg',
                    comment:'Plz buy Norman Fucking Rockwell on everywhere',
                    time:'2019年9月16日 18:43',
                    commentNum:0,
                    like:5,
                    inputShow:false,
                    reply:[]
                },
            ]
        }
    },
    directives: {clickoutside},
    methods: {
        inputFocus(){
            var replyInput = document.getElementById('replyInput');
            replyInput.style.padding= "8px 8px"
            replyInput.style.border ="2px solid blue"
            replyInput.focus()
        },  
        showReplyBtn(){
            this.btnShow = true
        },
        hideReplyBtn(){
            this.btnShow = false
            replyInput.style.padding= "10px"
            replyInput.style.border ="none"
        },
        showReplyInput(i,name,id){
            this.comments[this.index].inputShow = false
            this.index =i
            this.comments[i].inputShow = true
            this.to = name
            this.toId = id
        },
        _inputShow(i){
            return this.comments[i].inputShow 
        },
        sendComment(){
            if(!this.replyComment){
                 this.$message({
                    showClose: true,
                    type:'warning',
                    message:'评论不能为空'
                })
            }else{
                let a ={}
                let input =  document.getElementById('replyInput')
                let timeNow = new Date().getTime();
                let time= this.dateStr(timeNow);
                a.name= this.myName
                a.comment =this.replyComment
                a.headImg = this.myHeader
                a.time = time
                a.commentNum = 0
                a.like = 0
                this.comments.push(a)
                this.replyComment = ''
                input.innerHTML = '';

            }
        },
        sendCommentReply(i,j){
            if(!this.replyComment){
                 this.$message({
                    showClose: true,
                    type:'warning',
                    message:'评论不能为空'
                })
            }else{
                let a ={}
                let timeNow = new Date().getTime();
                let time= this.dateStr(timeNow);
                a.from= this.myName
                a.to = this.to
                a.fromHeadImg = this.myHeader
                a.comment =this.replyComment
                a.time = time
                a.commentNum = 0
                a.like = 0
                this.comments[i].reply.push(a)
                this.replyComment = ''
                document.getElementsByClassName("reply-comment-input")[i].innerHTML = ""
            }
        },
        onDivInput: function(e) {
            this.replyComment = e.target.innerHTML;
        },
        dateStr(date){
            //获取js 时间戳
            var time=new Date().getTime();
            //去掉 js 时间戳后三位,与php 时间戳保持一致
            time=parseInt((time-date)/1000);
            //存储转换值 
            var s;
            if(time<60*10){//十分钟内
                return '刚刚';
            }else if((time<60*60)&&(time>=60*10)){
                //超过十分钟少于1小时
                s = Math.floor(time/60);
                return  s+"分钟前";
            }else if((time<60*60*24)&&(time>=60*60)){ 
                //超过1小时少于24小时
                s = Math.floor(time/60/60);
                return  s+"小时前";
            }else if((time<60*60*24*30)&&(time>=60*60*24)){ 
                //超过1天少于30天内
                s = Math.floor(time/60/60/24);
                return s+"天前";
            }else{ 
                //超过30天ddd
                var date= new Date(parseInt(date));
                return date.getFullYear()+"/"+(date.getMonth()+1)+"/"+date.getDate();
            }
        }
    },    
}
</script>

注: stylus,是 CSS 的预处理框架。 CSS 预处理,顾名思义,预先处理 CSS。若使用stylus,须预先引入stylus依赖

npm install stylus stylus-loader --save-dev

css 

<style lang="stylus" scoped>
.my-reply
    padding 10px
    background-color #fafbfc
    .header-img
        display inline-block
        vertical-align top
    .reply-info    
        display inline-block
        margin-left 5px
        width 90%
        @media screen and (max-width:1200px) {
            width 80%
        }
        .reply-input
            min-height 20px
            line-height 22px
            padding 10px 10px
            color #ccc
            background-color #fff
            border-radius 5px
            &:empty:before
                content attr(placeholder)
            &:focus:before
                content none
            &:focus
                padding 8px 8px
                border 2px solid blue
                box-shadow none
                outline none
    .reply-btn-box
        height 25px
        margin 10px 0
        .reply-btn
            position relative
            float right
            margin-right 15px
.my-comment-reply
    margin-left 50px
    .reply-input
        width flex
.author-title:not(:last-child)
    border-bottom: 1px solid rgba(178,186,194,.3)
.author-title
    padding 10px
    .header-img
        display inline-block
        vertical-align top
    .author-info
        display inline-block
        margin-left 5px
        width 60%
        height 40px
        line-height 20px
        >span 
            display block
            cursor pointer
            overflow hidden
            white-space nowrap
            text-overflow ellipsis
        .author-name
            color #000
            font-size 18px
            font-weight bold
        .author-time
            font-size 14px
    .icon-btn
        width 30%
        padding 0 !important 
        float right
        @media screen and (max-width : 1200px){
            width 20%
            padding 7px
        }
        >span 
            cursor pointer
        .iconfont 
            margin 0 5px
    .talk-box
        margin 0 50px
        >p
           margin 0
        .reply
            font-size 16px
            color #000
    .reply-box
        margin 10px 0 0 50px
        background-color #efefef
</style>

原文链接: https://blog.csdn.net/zLanaDelRey/article/details/100997792

Vue.js实现文章评论回复评论功能
10-19
主要为大家详细介绍了Vue.js实现文章评论回复评论功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
vue+elementUI实现简单日历功能
10-14
主要为大家详细介绍了vue+elementUI实现简单日历功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
vue +element 评价功能
weixin_38673922的博客
08-19 1922
vue element 评价功能
基于Vue2.0 + ElementUI开发论坛评论回复功能
zydemon的专栏
03-12 748
本文将介绍如何使用 Vue2.0 和 ElementUI 开发一个简单的论坛评论回复功能
vue+elementUI+后端springboot多用户评论回复、点赞
大帅哥的博客
06-11 6353
评论回复、点赞、取消点赞。 前端 vue+elementUIvue脚手架vue-VLI、axios 后端 springboot、mybatis-plus(和其代码生成器)
利用Vue+ElementUi实现评论回复功能-仿掘金
weixin_44288191的博客
03-19 7522
利用Vue+ElementUi实现评论功能-仿掘金 效果展示 实现代码 comment.vue <template> <div> <div v-clickoutside="hideReplyBtn" @click="inputFocus" class="my-reply"> <el-avatar class="header-img" :size="40" :src="myHeader"></el-avatar>
Vue+ElementUI实现简易的留言板功能
qq_57490170的博客
12-08 978
这里的路径使用你自己下载的路径。
Vue实现评论功能
热门推荐
原地起飞
05-10 1万+
实现评论功能最开始确实是令我头疼的一件时间,因为不确定评论的字数,就要自适应高度,还不确定评论的层级,这看起来就很令人头疼。评论功能麻烦在于它是由层次的,有不停的回复功能,这点是令人比较头疼的地方,我在写这个功能的时候做了比较笨的一个方法去处理它。 我先选择了布局页面,先把页面布局好以后在去想怎么发表评论怎么回复评论一起渲染不确定层次的评论内容。 1、布局页面 想要实现以上布局方式,我在这个地方采取了flex布局, 让他自己去撑开盒子,这样就实现了高度自适应的一个方式,我在每一条评论内容下面隐藏.
vue + vuex 实现评论回复
花子占爷的博客
04-24 4322
vue + vuex 实现评论回复,超简单组件,源码地址放后面了~
vue3评论回复功能
m0_45215325的博客
03-28 2443
简单的实现了页面布局,点击回复等小功能(删除数据和回复添加到数组中目前没有写,因为项目要求后面需要对接后端接口,所以就懒得写了)代码中很多小细节没有处理,比如只写了删除的样式,没有写功能,时间没有写用v-for遍历,直接写死的,可能是我太懒了,哈哈哈哈。自我感觉该有的功能还是挺全面的,虽然样式略显粗糙,css样式写的稍许凌乱,部分代码因为项目需要,所以懒得精简。运用的是vue3+ts,文本框和小图标使用的是ant-design-vue框架。子组件CommentList。
Vue+element完成带表情评论功能
caohao66的博客
02-25 1708
实现一个带表情评论功能,但是一搜索都是JQ的一些插件,使用emojiVue这个组件(https://github.com/shershen08/emoji-vue),出现了光标老是跑到第一个的情况,搜了一圈也没找到好的解决办法,于是自己进行了编写,新手入门请多谅解。 html部分采用了el-input+el-popover+el-tabs <template> <div class="emoji-chat"> <el-input class="
vue.js实现带表情评论功能前后端实现(仿B站评论
pscool的博客
04-15 3109
文章目录学习链接效果图后台建表评论表(重要)用户表实体类CommentUserCommentDTO(重要)WebConfig配置配置跨域和静态资源文件夹Mybatisplus相关类MyBatisPlusConfig 配置分页插件CommentMapperCommentMapper.xmlCommentServiceImpl评论接口CommentControllerPageUtilsResult其它相关类和配置启动类application.ymlpom.xml前台 学习链接 程序员老罗B站项目视频 JS操作文
vue+elementUI实现图片上传功能
01-19
本文实例为大家分享了vue+elementUI图片上传的具体代码,供大家参考,具体内容如下 1、html 图片 prop=logo> <el-upload name=file v-if=optype==0 :action='/upload' accept=.jpg, .png list-type=picture-...
vue+elementUI组件table实现前端分页功能
10-15
主要为大家详细介绍了vue+elementUI组件table实现前端分页功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
springboot+vue+elementui实现增删改查和分页查询
09-20
springboot+vue+elementui实现增删改查和分页查询,最基础的前后端加数据库功能实现
如何利用vue+vue-router+elementUI实现简易通讯录
10-17
主要介绍了如何利用vue+vue-router+elementUI实现简易通讯录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
vue快速入门(四十六)Router的安装与使用
不起眼小菜菜的博客
04-26 705
步骤很详细,直接上教程……
报表控件Stimulsoft在JavaScript报告工具中的事件:查看器事件(上)
励志做最业余的专业博主,控件产品可以私我~
04-28 812
在本文中,我们为JS报告工具中的查看器事件提供了全面的指南,包括它们的详细描述、参数列表等一系列详细内容。
bpmn-js推荐几款常用的插件
最新发布
飞云先生
04-30 83
bpmn-js整体框架库的风格是以组件的方式进行实现的,这样的结构也更加便于我们更好的对其进行功能扩展,以及客制化功能实现。其实bpmn.io已经为我们实现了较多场景的组件的实现,了解对应组件的功能更能便于我们分是否需要自己实现,降低重复造轮子的行为,提高开发效率,本篇文章主要是介绍常见的bpmn-js中使用的组件库。
请用springboot+vue+elementUI实现会议室预约功能
04-26
好的,我可以为您解答如何使用Spring Boot、VueElementUI实现会议室预约功能。 首先,您可以使用Spring Boot作为后端框架,Vue作为前端框架,ElementUI作为UI组件库,实现会议室预约功能。 后端实现: 1. 创建Spring Boot项目。 2. 创建一个RESTful API,用于获取可用的会议室、预约会议室和取消预约等操作。 3. 使用Spring Data JPA和数据库相集成,存储会议室和预约信息。 前端实现: 1. 使用Vue.js创建前端应用程序。 2. 使用ElementUI的组件,例如表单、日期选择器、按钮等等,创建UI页面。 3. 使用Axios,与后端的API进行通信,获取可用的会议室、预约和取消预约等操作。 4. 根据用户的输入进行数据校验和业务逻辑处理,并且根据需要呈现信息,例如错误验证信息、会议室预约成功信息等。 以上是关于如何使用Spring Boot、VueElementUI实现会议室预约功能的简短介绍。如果您需要更详细的信息,请告诉我,我可以提供更多的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • RestTemplat中getForobject方法的用法 29625
  • 利用VUE+elementUI实现评论、回复评论,评论展示功能 21800
  • Centos7 使用yum命令安装软件失败,报错"Couldn't open file /media/cdrom/repodata/repomd.xml" 11282
  • SQL SERVER 批量修改时间由yyyy/MM/dd转为yyyy-MM-dd 7239
  • react项目导入PropTypes报错: Typo in static class property declaration react/no-typos 4133

分类专栏

  • 数据库
  • 软件安装 1篇
  • 前端 5篇
  • 设计模式 1篇
  • #小程序开发 1篇
  • 使用技巧 2篇
  • spring cloud 2篇
  • Linux 7篇
  • 服务器 2篇
  • Java Web开发 8篇
  • Java 开发 4篇
  • spring boot 4篇
  • SSM 3篇

最新评论

  • 利用VUE+elementUI实现评论、回复评论,评论展示功能

    T1739887592: 效果棒极了,但是想改为自己数据的大佬们要注意'inputShow'字段了表情包

  • 利用VUE+elementUI实现评论、回复评论,评论展示功能

    坚硬的锄头: 后端是怎么做的

  • Centos7 使用yum命令安装软件失败,报错"Couldn't open file /media/cdrom/repodata/repomd.xml"

    m0_73149647: 为什么删不了

  • 单例模式:静态内部类实现的单例模式是懒加载且线程安全的

    喑哑于秋: “因为这个类的实例化是靠静态内部类的静态常量实例化的。”这里表述有误,实际上这里的 'INSTANCE' 实例是靠static起作用的,不用final修饰也是单例的,因为类只会加载一次,是因为这个类加载机制决定了只会创建一个实例对象。

  • Sublime 打开文件中文乱码

    m0_64575556: 输入install Package Contr之后啥也没找到

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Sublime 打开文件中文乱码
  • SQL SERVER 批量修改时间由yyyy/MM/dd转为yyyy-MM-dd
  • Mybatis-Plus分页无效,total为0
2022年1篇
2020年11篇
2019年14篇
2018年8篇

目录

目录

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司榆林SEO按效果付费推荐坪地如何制作网站多少钱松岗网站制作哪家好广元百度关键词包年推广报价南平网站定制公司银川英文网站建设公司那曲企业网站改版报价汕尾网站开发哪家好定西网页制作多少钱坑梓百度seo贺州网站优化报价临沧SEO按天收费推荐朝阳建网站价格贵阳网站设计哪家好岳阳百搜标王推荐武汉关键词按天计费推荐潜江关键词按天计费多少钱南山网站建设设计淄博百姓网标王邢台企业网站设计推荐清远SEO按天扣费报价日照百姓网标王推广哪家好黄石网站推广工具公司黄冈网站搜索优化报价贵港百度seo报价至尊标王推荐同乐网站建设设计推荐绍兴百度网站优化报价荆州网站优化按天计费公司阜阳网站优化按天扣费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化