【问题标题】:Highlight newly inserted row in Vue.js突出显示 Vue.js 中新插入的行
【发布时间】:2020-11-26 04:19:13
【问题描述】:

我正在从 REST API 获取 JSON 数据(订单)并使用 Vue js 在动态 HTML 表中显示。表格中的每一行都有一个“打印”按钮。按钮的目的是打印结构中的行数据,基本上是一张账单。 为此,我想突出显示新添加的行,直到用户单击“打印”按钮。我如何实现这一目标? 我每分钟都在刷新桌子。 这是我的代码。

<tr v-for="orders, index in orders">
  <th scope="row">{{ index + 1 }}</th>
    <td>{{ orders.id }}</td>
    <td>{{ orders.billing.first_name + " " +orders.billing.last_name }}</td>
    <td>{{ orders.date_created }}</td>
    <td>{{ orders.billing.phone}}</td>
    <td>{{ orders.billing.address_1 + ", " + orders.billing.address_2 + ", " + orders.billing.city + orders.billing.postcode }}</td>
    <td>{{ orders.line_items.name}}</td>
    <td>{{ orders.total}}</td>
    <td><button class="btn btn-primary" (click)="printBill(data)">Print</button></td>
  </tr>
</tbody>
</table>
</div>
<script>
var app = new Vue({
  el: '#app',
  data: {
    orders: []
  },
  mounted: function() {
    axios.get('https://localhost/Site/wp-json/wc/v3/orders?consumer_key=KEY&consumer_secret=KEY1')
      .then(response => {
        this.orders = response.data;
        console.log(response);
       })
       .catch(error => {
         console.log(error);
        });
     },      
  })
</script>

【问题讨论】:

  • 每一行的数据模型都应该包含一个标志,表明它是新的还是已经打印出来,然后使用它来将样式绑定到该行。当您打印该行时,请关闭该标志。
  • 感谢您的回答。我是网络开发的新手。我可以知道你所说的标志和绑定是什么意思吗?

标签: javascript html jquery vue.js


【解决方案1】:

我写了一个小例子,看看:

<template>
  <div id="app">*
    <tr
      v-for="(order, index) in orders"
      :key="index"
      :class="{highlight: orders[index].isPrinted === undefined}"
    >
      <th scope="row">{{ index + 1 }}</th>
      <td>{{ order.name }}</td>
      <td>{{ order.something}}</td>
      <td>
        <button class="btn btn-primary" @click="printBill(index)">Print</button>
      </td>
    </tr>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      orders: []
    };
  },
  methods: {
    printBill(index) {
      //code to print the bill

      //change flag
      this.$set(this.orders[index], "isPrinted", true);
    }
  },
  mounted() {
    //axios request - data sample
    this.orders = [
      {
        name: "first",
        something: "whatever"
      },
      {
        name: "second",
        something: "whatever"
      },
      {
        name: "third",
        something: "whatever"
      },
      {
        name: "fourth",
        something: "whatever"
      },
      {
        name: "fifth",
        something: "whatever"
      }
    ];
  }
};
</script>

<style>
.highlight {
  background-color: blue;
  color: white;
}
th {
  width: 20%;
}
td {
  width: 20%;
}
</style>

你可以运行它here。


如您所见,每当printBill 方法运行时,我都会向订单数组中的元素添加一个标志。

通过跟踪新添加的属性,我们可以有条件地显示高亮类。

【讨论】:

【解决方案2】:

为每行数据添加一个isPrinted 标志,如果行之前已被标记,请确保保留此标志。此外,每分钟调用一次 API。

  mounted: function() {
    // Call the API the first time
    this.refreshData()
    // Then call the API every minute
    this.setIntervalId = setInterval(this.refreshData, 60000)
  },
  beforeDestroy: function() {
    // Stop refreshing data after the component is destroyed!
    clearInterval(this.setIntervalId)
  }
  methods: {
    // Extract refresh logic into a method
    refreshData () {
      axios.get('https://localhost/Site/wp-json/wc/v3/orders?consumer_key=KEY&consumer_secret=KEY1')
      .then(response => {
        // Note the orders we previously flagged as printed, so we can reapply the flag after refreshing
        const previouslyFlaggedIds = this.orders.filter(x => x.is_printed).map(x => x.id);
        this.orders = response.data.map(x => ({...x, is_printed: previouslyFlaggedIds.find(y => y === x.id) != null}));
       })
       .catch(error => {
         console.log(error);
      });
    }
  }

使用它来设置行的样式

<tr
      v-for="(order, index) in orders"
      :key="order.id"
      :class="{highlight: !order.is_printed}"
    >

在打印行时设置 is_printed。

<td><button class="btn btn-primary" @click="printBill(order)">Print</button></td>
methods: {
    printBill(order) {
      order.is_printed = true
    }
  }

【讨论】:

  • 您好,感谢您的回答。当我在代码 "" 中添加 样式代码替换行时。它会引发错误,例如“无法读取属性 first_name....我是否以错误的方式插入代码?
  • @Tom 我将用于每个项目的变量从“订单”重命名为“订单” - 您能否在模板中检查您使用的订单详细信息 order.id 而不是 orders.id ?
  • 您好,感谢您的帮助,效果很好。只是想问一下,如果我刷新表以定期从 API 获取数据,比如每 1 分钟通过 setInterval js 函数。该标志将再次设置为默认值。所以,无论如何,如果 API 有更新,是否没有刷新整个表或页面但用新行更新表。谢谢
  • @Tom 我已经用一个例子更新了我的答案,每分钟刷新一次数据 - 这将在刷新后保留标志。
  • 非常感谢,我可以在不刷新的情况下保留标志...真的很有帮助...
猜你喜欢
相关资源
最近更新 更多
热门标签