【问题标题】:Vue.js: Reactively update a component on a clickVue.js:在点击时响应式更新组件
【发布时间】:2018-12-03 08:47:38
【问题描述】:

我有一个组件,用于在收藏夹中添加/删除项目。它工作得很好,但用户看不到他/她是否将项目添加到收藏夹(如果项目被收藏,我会显示一个星形图标,如果不是,我会显示一个空图标)。我怎样才能被动地做到这一点?如果用户单击它,我希望我的图标更改其类别。

这是我的代码:

组件:

<template>
 <span :class="isFavorite
            ? 'mdi mdi-star favorite'
            : 'mdi mdi-star-outline'"
    class="favorite-item-icon"
    @click="isFavorite ? deleteFromFavoriteItems(itemId) : addToFavoriteItems(itemId)">
 </span>
</template>

<script>
 export default {
  import { mapGetters, mapActions } from 'vuex';

  props: ['itemId', 'isFavorite'],
  methods: {
    ...mapActions(['addToFavoriteItems', 'deleteFromFavoriteItems']),
  },
};
</script>

父组件的v-for列表中的组件:

...
 <favorite-label :itemId="item.id" :isFavorite="item.is_favourite" />
...

在我的店里:

addToFavoriteItems({ commit }, itemId) {
  http
    .post(`${config.api}api/v1/items/favourite-save`, {
      item_id: itemId,
    });
deleteFromFavoriteItems({ commit }, itemId) {
  http
    .post(`${config.api}api/v1/items/favourite-delete`, {
      item_id: itemId,
    });

【问题讨论】:

    标签: javascript vue.js reactive-programming


    【解决方案1】:

    您需要从服务器(更新后)将item 分配给商店,例如:

    $post(..., { item_id: itemId }).then(function(response) {
      this.$store.commit('items/SET_ITEM', response.data)
    })
    

    items/SET_ITEM 突变循环当前数组中的项目并在 id 匹配时更新项目。

    let itemToUpdate = this.items.forEach(function(i) {
      if (i.id === item.id) {
        i = item
      }
    })
    

    然后它应该正确地改变 store 调度 prop 更新并使用新的 isFavorite 计算重新渲染视图。

    或者,如果可以使用您传递的itemId,则服务器没有理由更改任何内容,只需传递它,例如:

    $post(..., { item_id: itemId }).then(function() {
      this.$store.commit('items/UPDATE_FAVORITE', { item: itemId })
    })
    

    现在您可以添加一个切换收藏夹的突变,基本上:

    this.items.forEach(function(i) {
      if (i.id === item) {
          i.is_favorite = !i.is_favorite
      }
    })
    

    【讨论】:

    • 非常感谢您提出的解决方案。不幸的是,它仍然像以前一样工作。我的图标不会被动地改变自己,只有在刷新之后。是否可以添加某种观察者?
    • 好的,我解决了这个问题,现在我的图标会自动更新。但是,这发生得非常慢(大约 2 秒)。这有什么方法可以更快地切换图标吗?我认为一旦我的请求得到响应并从收藏夹中添加或删除项目,它就会被切换。但是对于 UX,这种行为有点慢...... :(
    • @OlgaB 您可以在发布请求之前执行commit,如果有问题,可以使用.catch(error) 回滚
    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2020-09-11
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多