【问题标题】:Side Effects In Computed Property and Updating after it changes计算属性的副作用和更改后的更新
【发布时间】:2020-05-22 18:58:21
【问题描述】:

我有一个想要更新的页面,方法是使用导航抽屉转到我从 API 查询的不同组并将该信息写入数据表。我在 returnurl 计算机属性中不断受到意想不到的副作用。我不确定我能做些什么来解决这个问题。此外,我正在尝试在 groupName 更改后再次加载页面,但到目前为止我也没有成功。

谢谢

GroupList.vue

<template>
  <div class="grouplist">
    <v-card-title>
      Swipe Report {{groupName}}
      <v-spacer></v-spacer>
      <v-text-field
        v-model="search"
        append-icon="mdi-magnify"
        label="Search"
        single-line
        hide-details
      ></v-text-field>
    </v-card-title>
    <v-data-table
      :headers="headers"
      :items="swipedata"
      :items-per-page="100"
      :search="search"
      loading
      loading-text="Loading... Please wait"
    ></v-data-table>
    <p></p>
  </div>
</template>

<script>
// @ is an alias to /src
import axios from "axios";

export default {
  name: "GroupList",
  data() {
    return {
      search: "",
      headers: [
        {
          text: "First Name",
          value: "firstname"
        },
        {
          text: "Las Name",
          value: "lastname"
        },
        {
          text: "Reader Location",
          value: "readerdesc"
        },
        {
          text: "Card Number",
          value: "cardnum"
        },
        {
          text: "Event Time",
          value: "eventtime"
        }
      ],
      groupName: this.$route.params.group,
      swipedata: []
    };
  },
  mounted() {
    this.init();
  },
  computed: {
    returnurl() {
      return (this.returnurl =
        "http://localhost:5000/" + this.$route.params.group);
    }
  },
  methods: {
    init() {
      axios
        .get(this.returnurl)
        .then(response => (this.swipedata = response.data));
    }
  },
  components: {}
};
</script>

路线:

 {
    path: "/groups/:group",
    component: GroupList,
  },

链接格式如下: http://localhost:5000/groups/Action http://localhost:5000/groups/Salary http://localhost:5000/groups/Hourly

在每个链接上刷新 GroupList 视图,因为它不是来自链接。我必须手动刷新页面。

【问题讨论】:

    标签: javascript vue.js vuejs2 vuetify.js


    【解决方案1】:

    您计算的“returnurl”格式错误。

    计算值将是您在其中返回的任何值,您不应该在函数内部设置它,就像您对“returnurl = '...'”所做的那样。

    您的计算结果应如下所示:

    returnurl(){
      return `http://localhost:5000/${this.$route.params.group}`;
    }
    

    接下来,您希望能够单击链接,更改 url,然后重新运行您的生命周期挂钩。

    当前发生的事情是 Vue 的预期行为,它尝试重用相同的组件,期望您更新数据。

    重新运行生命周期挂钩的简单解决方案: 将“key”属性添加到您的路由器视图中,如下所示:

    <router-view :key="$route.fullPath">
    

    这样,每当您的 url 发生任何变化时,键都会发生变化,并且应该会触发组件的重新创建。

    你可以看到一个例子,由 LinusBorg HERE 制作

    这种解决方案在某些情况下可能有点过于极端,因为这会触发路由器视图中所有组件的重新创建,这在更大的应用程序中可能会很糟糕。

    另一种解决方案是在 $route 中添加一个观察者,并在其中调用您的 init 函数,以及您可能想要进行的其他更改。

    这是来自official vue-router docs的解释

    【讨论】:

    • 我需要更新它,因为我对所有组报告使用相同的组件。我在导航抽屉中有我的链接,它会在我手动点击页面上的刷新后工作,但我需要能够在选择链接并转到 localhost:5000/groups/GROUPIDPASSEDIN 时触发 axios get 跨度>
    • 让我看看我是否明白你的意思。你有一组链接。当您单击一个链接时,您希望使用链接中的 groupId 更改 url。单击链接后,您想从 api 中获取具有新 id 的数据吗?
    • 我已经用更多信息更新了我原来的问题。我希望在从导航抽屉中单击每个链接时更新 GroupList 视图。
    • 我现在明白了,我更新了我的答案,希望对您有所帮助。
    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2019-11-09
    • 2020-09-13
    • 2014-04-06
    相关资源
    最近更新 更多