【问题标题】:vue js table highlight effect similar to Stack Overflow when a new row is addedvue js表格高亮效果类似Stack Overflow添加新行时的效果
【发布时间】:2018-05-13 16:33:12
【问题描述】:

我有一个简单的表,用户可以向其中添加行。界面和这个很像:
https://jsfiddle.net/fgu4q8j0/1/

<div id="app">
  <table class="list">
    <tr v-for="(task,index) in tasks">
      <td>{{index+1}}.</td>
      <td>{{task.text}}</td>
    </tr>
  </table>
  <input type="text" v-model="newTask" />
  <button type="button" @click="tasks.push({text: newTask})">Add</button>
</div>

new Vue({    
  el: "#app",
  data: {
    newTask: "",
    tasks: [{text: 'task1'}, {text: 'task2'}]
  }
});

我想在添加新行时创建高亮效果,该效果会缓慢衰减 - 非常类似于 Stack Overflow 在单击包含特定答案/评论的哈希 (#) 的 url 时的橙色高亮效果。
如我所见,Stack Overflow 使用 jQuery 制作动画。我正在寻找一个纯 CSS 的解决方案,希望除了 tasks.push(..) 之外什么都不做,并且可能集成到 vue 过渡系统中。

【问题讨论】:

    标签: javascript animation vue.js html-table


    【解决方案1】:

    您可以通过使用动画并为您的新项目添加一个类来做一些简单的事情:

    new Vue({
      el: "#app",
      data: {
        newTask: "",
        tasks: [{
          text: 'task1'
        }, {
          text: 'task2'
        }]
      }
    });
    tr.new {
      animation: blink 2s ease;
    }
    
    @keyframes blink {
      0% {
        background-color: yellow;
      }
      100% {
        background-color: white;
      }
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
    <div id="app">
      <table class="list">
        <tr v-for="(task,index) in tasks" :class="{new: task.new}">
          <td>{{index+1}}.</td>
          <td>{{task.text}}</td>
        </tr>
      </table>
      <input type="text" v-model="newTask" />
      <button type="button" @click="tasks.push({text: newTask, new: true})">Add</button>
    </div>

    如果你不想像这样跟踪状态,那么你必须正确地做事并使用 Vue 的&lt;transition-group&gt;,如果你检查this,它说你需要模板选项来绕过浏览器在table 中剥离标签的行为...所以你可以创建一个像这样的组件:

    Vue.component('tasks-list', {
      template: `
        <div>
          <table class="list">
            <transition-group name="blink">
              <tr v-for="(task,index) in tasks" :key="index">
                <td>{{index+1}}.</td>
                <td>{{task.text}}</td>
              </tr>
            </transition-group>
          </table>
          <input type="text" v-model="newTask" />
          <button type="button" @click="tasks.push({text: newTask, new: true})">Add</button>
        </div>`,
      data() {
        return {
          newTask: "",
          tasks: [{
            text: 'task1'
          }, {
            text: 'task2'
          }]
        }
      }
    })
    new Vue({
      el: "#app",
    });
    .blink-enter-active,
    .blink-leave-active {
      transition: background 2s ease;
      background-color: white;
    }
    
    .blink-enter,
    .blink-leave-to {
      background-color: yellow;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
    <div id="app">
      <tasks-list></tasks-list>
    </div>

    【讨论】:

    • 这很好,但我不喜欢添加行需要新的数据成员。也许为此创建一个指令会更好?什么会更有效率/性能?
    【解决方案2】:

    您可以在tr 周围添加&lt;tbody name="fade" is="transition-group"&gt; 标记,使其适用于表格行。见this Github issue

    new Vue({    
      el: "#app",
      data: {
        newTask: "",
        tasks: [{text: 'task1'}, {text: 'task2'}]
      }
    });
    body {font-size: 20px}
    
    .fade-enter-active, .fade-leave-active {
      background-color: none;
      transition: all 2s;
    }
    .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
      background-color: yellow;
    }
    <script src="https://unpkg.com/vue@2.5.16/dist/vue.min.js"></script>
    
    <div id="app">
      <table class="list">
        <tbody name="fade" is="transition-group">
          <tr v-for="(task,index) in tasks" :key="index">
            <td>{{ index + 1 }}.</td>
            <td>{{ task.text }}</td>
          </tr>
        </tbody>
      </table>
      <input type="text" v-model="newTask" />
      <button type="button" @click="tasks.push({text: newTask})">Add</button>
    </div>

    【讨论】:

    • 不能使用列表,我需要表格。而且我实际上更喜欢这种解决方案,而不是仅仅为了过渡而创建数据成员。我的意思是,在我调用 .animate() 之后使用 jQuery,效果结束后周围没有数据或任何副作用
    • 我已经编辑了答案,通过添加&lt;tbody name="fade" is="transition-group"&gt; 标签使其适用于表格。
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多