Vue消息列表已读/未读状态实时更新及数据更新set()用法

效果如下:

代码部分:(HTML部分使用Element的Collapse 折叠面板)

<template>
<el-collapse accordion>
<el-collapse-item v-for="(list,index) in noticeData" :key="index" >
<template slot="title">
<span v-if="list.status == 0">[未读]</span>
<span v-if="list.status == 1" class="actived">[已读]</span>
<b @click="noticeActive(list.id,list.status)">{{list.title}}</b><i class="el-icon-alarm-clock time">{{list.create_time.substring(0,11)}}</i></template>
<div>{{list.content}}</div>
</el-collapse-item>
</el-collapse>
</template>
<script>
export default {
  name: "notice",
  data(){
    return{
      noticeData:"",//系统通知数据
    }
  },
  mounted(){
    this.getNotice();    
  },
  methods:{
    //获取通知
    getNotice(){
     
    .....获取消息数据.....

        if (response.data.status==1) {
          console.log(response.data.data)
          this.noticeData = response.data.data;          
        }

    .....获取消息数据.....

    },
    //设置点击过的系统消息已读  参数消息id 消息是否阅读状态status(1已读,0未读)
    noticeActive(eventId,eventStatus) {
      console.log(eventId,eventStatus);
      if(eventStatus == 0){ //阅读状态是未读提交已读申请
        
       .....提交阅读状态数据.....

          if (response.data.status==1) {
            //提交成功后更新阅读状态为已读不用重新申请数据也不用刷新页面
            this.$set(this.noticeData[eventId-1],'status',1); 
          }

       .....提交阅读状态数据.....

      }
    }
  }
}
</script>
<style>
.el-collapse{border:none;}
.el-collapse div:last-child > div div{border:none;}
.el-collapse-item__header{position:relative;font-size:16px;justify-content:space-between;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.el-collapse-item__header b{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:normal;}
.is-active b{padding-left:20px;transition:all .5s;}
.el-collapse-item__header .time{position:absolute;right:30px;font-size:14px;}
.el-icon-alarm-clock:before{margin-right:10px;}
.el-collapse-item__header span{font-size:12px;color:brown;margin-right:10px;}
.el-collapse-item__header span.actived{color:#666;}
.el-collapse-item__content{font-size:14px;line-height:26px;padding:30px 20px;color:#666;background:#f8f8f8;}
</style>

数据更新:

this.$set(Obj,key, value)/vue.set(Obj, key, value)方法 

数组操作:this.$set("数组名","下标","值")

对象操作:this.$set("对象名","属性","值")

<script>
export default {
 data() {
   return {
    person: ["张三","李四","王五"],
    student: [
      {
        name: '张三',
        age:11
        },
        {
        name: '李四',
        age:13
      },
    ],
   }
 },
 methods: {
   
   //添加到数组
   setPerson(){
     this.$set(this.person,1,"刘六") 
   },

   //添加数组对象
   setStudent() {
     this.$set(this.student[0], 'age', 15)
   },


 }
}
</script>

Object.assign(target, sources)方法

<script>
export default {
 data() {
   return {
     person: ["张三","李四","王五"],
     student: [
      {
        name: '张三',
        age:11
        },
        {
        name: '李四',
        age:13
      },
    ]
   }
 },
 methods: {
   setMessage() {
     this.student[1].age = 15;
     this.student = Object.assign({}, this.student)
   }
 }
}
</script>

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Vue数据改变后视图不更新的情况有以下几种: 1. 直接修改数组某个下标的值,Vue无法监测到该变化,因为Vue会在初始化时劫持数组的一些方法来监听数组变化,如push、pop、shift、unshift、splice、sort、reverse等,而直接修改数组的某个下标的值并不是这些方法,所以Vue无法感知到变化。 解决方式:使用Vue提供的变异方法来修改数组,如$set、splice等。 2. 对象属性添加或删除时,Vue也无法检测到变化,因为Vue只劫持了对象已有的属性。 解决方式:使用Vue提供的$set方法来添加属性,使用Vue提供的$delete方法来删除属性。 3. 多个组件共享同一个数据源,如果一个组件修改了数据,但是其他组件没有更新,这是由于Vue的组件实例是独立的,它们都有自己的状态,修改一个组件的状态并不会影响其他组件的状态。 解决方式:使用Vuex来进行全局状态管理,或者使用事件总线来进行组件之间的通信。 4. 在生命周期钩子函数中直接修改数据,由于Vue的异步更新机制,在生命周期钩子函数中修改数据可能会导致视图无法及时更新。 解决方式:在生命周期钩子函数中使用this.$nextTick方法,该方法会在DOM更新完毕后执行回调函数,确保视图已经更新后再进行数据的修改。 5. 在计算属性中修改数据,计算属性本质上是一个函数,当计算属性依赖的数据发生变化时,该函数会重新执行,如果在计算属性中修改数据,则会导致死循环。 解决方式:避免在计算属性中修改数据,如果必须要修改,可以使用watch监听该计算属性,然后在watch回调函数中进行修改。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值