带有过滤器的VueJS反应阵列

时间:2018-10-24 09:08:22

标签: javascript vue.js

我有一个带有两个过滤器的通知列表(“全部显示”,“显示未读”)。创建组件时,我会加载所有通知,然后调用过滤器“显示全部”。

created() {
   axios.get('user/notifications').then(response => {
       this.notifications = response.data;
       this.showAll();
   }).catch(e => {
       console.log(e);
   });
 },

这里是“全部显示”和“显示未读”方法:

showAll() {
     this.filteredNotifications = this.notifications;
},
showUnread() {
    this.filteredNotifications = _.filter(this.notifications, notif => {
          return notif.read_at === null;
    });
},

我要像这样迭代数组:

<li v-for="notif in filteredNotifications">
    <span @click="toggleNotification(notif)"></span>
</li>

在这里,我切换通知:

toggleNotification(notification) {
    axios.put('user/notification/' + notification.id + '/toggle', {_method: 'PUT'}).then(response => {
         notification.read_at = notification.read_at == null ? true : null;
    }).catch(e => {
         console.log(e);
    });
}

我正在尝试做到这一点,当我处于“显示未读”过滤器中时,每当我切换通知时,它将从该过滤器中删除。无法将其从原始数组中删除,因为当我单击“显示全部”时,我必须查看所有通知。

此刻,当我进入“未读过滤器”时,如果我切换通知,它将把通知read_at更改为true,但不会将其从列表中删除。只有当我再次单击过滤器时,它才会刷新。

我可以通过在每个过滤器中放置一个标志来轻松解决此问题,然后在toggleNotification中可以检查哪个标志处于活动状态并手动调用它的方法,但这对我来说太脏了。有帮助吗?

1 个答案:

答案 0 :(得分:0)

您的方法看起来还不错。但是,如果要通知标记为已读,则将请求发送到后端数据库以设置read_at = currentDate。当请求成功结束时,只需从this.filteredNotifications数组中按其索引排除读取通知,Vue将根据新数组重新呈现。

<li v-for="(notif, index) in filteredNotifications">
    <span @click="toggleNotification(notif, index)"></span>
</li>

然后使用您的方法:

toggleNotification(notification, index) {
    axios.put('user/notification/' + notification.id + '/toggle', {_method: 'PUT'}).then(response => {
       notification.read_at = notification.read_at == null ? true : null;
       this.filteredNotifications.splice(index, 1)
    }).catch(e => {
       console.log(e);
});

如果要基于响应重新呈现,则在响应中发送回所有未读的通知并设置this.filteredNotifications = response。