3

目标:

我有一个项目列表,当其中一个项目发生变化时,我想通过使其具有淡出为透明的黄色背景来引起用户的注意。

我如何尝试这样做:

我的 Vue 实例有一个items.

每个项目都有一个属性 ,isChanged它是一个布尔值,指示该项目是否已被界面中的某些操作更改。

我已将一个类绑定到项目,以便当它们的isChanged属性为真时,添加该类highlight

<ul v-for='item in items' :key='item.id'>
    <li :class="{ 'highlight' : item.isChanged>{{ item.name }}</li>
</ul>

高亮类只是将背景更改为黄色,然后将其淡化为透明:

.highlight {
    animation: yellowfadingbox 4s;
}

@keyframes yellowfadingbox {
    from {
        background: @yellow;
    }
    to {
        background: transparent;
    }
}

所以,作为一个例子,我有一个方法updateItem可以进行 ajax 调用,当它完成时,将该 itemsisChanged属性设置为 true。

updateItem: function (itemKey) {
            axios.get('/item/update', {
                params: {
                    id: id,
                }
            }).then(response => {
                this.item[itemKey].isChanged = true;
            });
        }

这样做的原因是它highlight为项目添加了适当的类,给了我想要的效果。但是,继续前进,highlight该类始终存在,因此我无法重新创建效果。

我该如何解决这种方法/是否有更聪明的方法?

4

1 回答 1

2

这是您可以做到的一种方法。

我使用的是过渡而不是动画。添加highlight类将背景设置为黄色。然后我再次将其删除以使过渡恢复透明。

我习惯于requestAnimationFrame延迟,以便过渡有机会生效。延迟解决了两个问题。首先,我们需要给 Vue 渲染的机会。其次,我们需要让浏览器有机会应用黄色背景(样式重新计算),否则过渡不会发生。有多种方法可以实现这两个目标。$nextTick可以用来克服第一个问题,但我们仍然需要一些方法来让浏览器应用样式。这变得很繁琐,因为您需要获取对相关元素的引用,然后使用它getComputedStyle来强制重新计算background-color. requestAnimationFrame相比之下,似乎是一个相对轻松的解决方案。

在此示例中,只需单击项目即可查看效果。

new Vue({
  el: '#app',
  data: {
    items: [{
        name: 'Red',
        id: 1,
        isChanged: false
      },
      {
        name: 'Green',
        id: 2,
        isChanged: false
      },
      {
        name: 'Blue',
        id: 3,
        isChanged: false
      },
      {
        name: 'Yellow',
        id: 4,
        isChanged: false
      }
    ]
  },
  methods: {
    onClick (item) {
      item.isChanged = true;
      
      requestAnimationFrame(() => {
        item.isChanged = false;
      });
    }
  }
});
.list-item {
  transition: background-color 4s;
}

.list-item.highlight {
  background-color: yellow;
  transition: none;
}
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<div id="app">
  <ul>
    <li
      v-for="item in items"
      :key="item.id"
      :class="{ 'highlight' : item.isChanged}"
      class="list-item"
      @click="onClick(item)"
    >
      {{ item.name }}
    </li>
  </ul>
</div>

于 2019-06-14T01:49:06.233 回答