【问题标题】:How to populate an array BEFORE mounted lifecycle hook如何在安装生命周期挂钩之前填充数组
【发布时间】:2018-07-29 09:21:37
【问题描述】:

我在 getFeedingsAgain 中有一个简单的 API 调用。我在“beforeMount”中调用它,但我可以通过我的 console.logs 看到,一旦调用“mounted”,我的“catFeedingsAgain”数据值就保持为空。我试图在调用组件的“mounted()”生命周期钩子之前填充 catFeedingsAgain 数组,因此我在“mounted()”钩子中的函数可以使用该数组数据。我怎样才能做到这一点?

感谢您的宝贵时间。

更新:现在包括整个组件代码。

注意:我基本上是在尝试用 getFeedingsAgain 中 API 调用的结果数组替换 Amcharts...Line Chart #2...."dataProvider" 中的初始数组。

```

<template>
  <!-- second chart group -->
  <div class="chart-block" style="padding-top:50px">
    {{ message }}
    <div ref="line" style="vertical-align: middle; display: inline-block; width: 50%; height: 30px;"></div>
    <div ref="column" style="vertical-align: middle;display: inline-block; width: 50%; height: 30px;"></div>
  </div>
</template>

<script>
  import axios from 'axios';

  export default {
    props: ['message'],
    name: 'app',
    computed:{

    },
    created(){
      this.getFeedingsAgain(this.message);
    },
    data() {
      return {
        chartCatID: this.message,
        catFeedingsAgain: [],
        catMedicationsAgain: [],
      }
    },
    mounted () {
      /**
       * Line Chart #2
       */
      // this.getFeedingsAgain(this.message);
      console.log("mounted");
      console.log(this.catFeedingsAgain);
      // TODO: line = weight(waf) / day(created?)
      AmCharts.makeChart( this.$refs.line, {
        "type": "serial",
        "dataProvider": [ {
          "day": 1,
          "weight_after_food": 120
        }, {
          "day": 2,
          "weight_after_food": 54
        }, {
          "day": 3,
          "weight_after_food": -18
        }, {
          "day": 4,
          "weight_after_food": -12
        }, {
          "day": 5,
          "weight_after_food": -51
        }, {
          "day": 6,
          "weight_after_food": 12
        }, {
          "day": 7,
          "weight_after_food": 56
        }, {
          "day": 8,
          "weight_after_food": 113
        }, {
          "day": 9,
          "weight_after_food": 142
        }, {
          "day": 10,
          "weight_after_food": 125
        } ],
        "categoryField": "day",
        "autoMargins": false,
        "marginLeft": 0,
        "marginRight": 5,
        "marginTop": 0,
        "marginBottom": 0,
        "graphs": [ {
          "valueField": "weight_after_food",
          "showBalloon": false,
          "lineColor": "#ffbf63",
          "negativeLineColor": "#289eaf"
        } ],
        "valueAxes": [ {
          "gridAlpha": 0,
          "axisAlpha": 0,
          "guides": [ {
            "weight_after_food": 0,
            "lineAlpha": 0.1
          } ]
        } ],
        "categoryAxis": {
          "gridAlpha": 0,
          "axisAlpha": 0,
          "startOnAxis": true
        }
      } );

      /**
       * Column Chart #2
       */
      // TODO: column = dose(dosage) / day(created?)
      AmCharts.makeChart( this.$refs.column, {
        "type": "serial",
        "dataProvider": [ {
          "day": 1,
          "value": -5
        }, {
          "day": 2,
          "value": 3
        }, {
          "day": 3,
          "value": 7
        }, {
          "day": 4,
          "value": -3
        }, {
          "day": 5,
          "value": 3
        }, {
          "day": 6,
          "value": 4
        }, {
          "day": 7,
          "value": 6
        }, {
          "day": 8,
          "value": -3
        }, {
          "day": 9,
          "value": -2
        }, {
          "day": 10,
          "value": 6
        } ],
        "categoryField": "day",
        "autoMargins": false,
        "marginLeft": 0,
        "marginRight": 0,
        "marginTop": 0,
        "marginBottom": 0,
        "graphs": [ {
          "valueField": "value",
          "type": "column",
          "fillAlphas": 1,
          "showBalloon": false,
          "lineColor": "#ffbf63",
          "negativeFillColors": "#289eaf",
          "negativeLineColor": "#289eaf"
        } ],
        "valueAxes": [ {
          "gridAlpha": 0,
          "axisAlpha": 0
        } ],
        "categoryAxis": {
          "gridAlpha": 0,
          "axisAlpha": 0
        }
      } );
    },
    methods:{
      getFeedingsAgain(value) {
        axios.get(`${process.env.KITTY_URL}/api/v1/feedings/?cat__slug&cat__name=${value}`)
          .then(response => {
            console.log("getFeedingsAgain: ");
            console.log(response.data.results);
            this.catFeedingsAgain = response.data.results
          })
          .catch(error => console.log(error));
      },
      getMedicationsAgain(value) {
        axios.get(`${process.env.KITTY_URL}/api/v1/medications/?cat__slug=&cat__name=${value}`)
          .then(response => {console.log("catMedications: ");console.log(response.data.results); this.catMedications = response.data.results})
          .catch(error => console.log(error));
      },
    }
  }
</script>

<style>
  .amcharts-chart-div a{
    text-indent: -9999px;
    outline: none;
  }
</style>

```

【问题讨论】:

    标签: vue.js vuejs2 amcharts


    【解决方案1】:

    你也可以创建一个观察者,当变量改变时执行一个动作。

    类似的东西

    watch: {
      catFeedingsAgain: function() {
        AmCharts.makeChart( this.$refs.line, {
          "type": "serial",
          "dataProvider": this.catFeedingsAgain,
          ...
        });
      }
    },
    

    您可以在此处找到文档; https://vuejs.org/v2/guide/computed.html#Watchers

    【讨论】:

    • 这可能是我正在寻找的。您提供的链接中的示例让我头晕目眩。我已经更新了我的帖子以显示我的整个组件。你能告诉我它应该是什么样子吗?
    • 只需将监视块放在您的数据块下(或其他地方,如果您愿意),然后将生成图表的代码移动到监视器内的函数中。
    • 是的。现在我只需要弄清楚如何制作它,因此每次加载此组件时,它都会获取当前的猫线信息。
    • hahaaa....“更新”的钩子解决了我最新的问题...现在每次我选择一只新猫时图表都会更新!惊人的。谢谢你的时间❤️?
    • 太好了,您已经拥有的“创建方法”应该在每次使用时更新组件。 - 编辑:你想通了,太好了:)
    【解决方案2】:

    您应该在创建视图并且已经观察到数据时获取数据,这发生在 created 钩子上。

    // rename beforeMount -> created
    created(){
      this.getFeedingsAgain(this.message);
    }
    

    来自Vuecreated码头

    在这个阶段,实例已经完成了对选项的处理 表示已设置以下内容:数据观察、计算 属性、方法、监视/事件回调。然而,安装 阶段尚未开始

    看来这就是你要找的东西

    【讨论】:

      【解决方案3】:

      首先,您不应该使用beforeMount() 方法。尽可能避免它。而是使用created()生命周期方法:

      created() {
            this.getFeedingsAgain(this.message);
      }
      

      其次,您希望在调用 mount 之前填充一个数组。但是由于您的数据是从 API 异步加载的,因此您不能这样做。您不能停止/暂停 mounted 事件的发生。 Vue.js 不知道 API 响应何时可用。它可能需要 2 秒、3 秒或干脆失败。

      您唯一的选择是在您的模板中使用v-if。只要您的数组长度为零,您就可以隐藏 DOM 元素或显示加载进度条。

      首先,您不应该使用beforeMount() 方法。尽可能避免它。而是使用created()生命周期方法:

      created() {
            this.getFeedingsAgain(this.message);
      }
      

      其次,您希望在调用 mount 之前填充一个数组。但是由于您的数据是从 API 异步加载的,因此您不能这样做。您不能停止/暂停 mounted 事件的发生。 Vue.js 不知道 API 响应何时可用。它可能需要 2 秒、3 秒或干脆失败。

      您唯一的选择是在您的模板中使用v-if。只要您的数组长度为零,您就可以隐藏 DOM 元素或显示加载进度条。

      最后,您可能想要初始化某种图表,然后您可以使用 Vue.js 观察器或在 API 的 then() 块中对其进行初始化。

      编辑

      我必须这样做,然后如果我希望在每次更改时初始化 Charting 组件,我将使用 watcher:

      watch: {
          catFeedingsAgain() {
              AmCharts.makeChart(this.$refs.line, {
                  "type": "serial",
                  "dataProvider": this.catFeedingsAgain,
              });
          }
      },
      

      如果我只需要这样做一次,那么我会这样做:

      methods: {
          getFeedingsAgain(value) {
              axios.get(`${process.env.KITTY_URL}/api/v1/feedings/?cat__slug&cat__name=${value}`)
              .then(response => {
                  this.catFeedingsAgain = response.data.results;
                  AmCharts.makeChart(this.$refs.line, {
                      "type": "serial",
                      "dataProvider": this.catFeedingsAgain,
                  });
              })
              .catch(error => console.log(error));
          },
      }
      

      两者都是正确的方法。这一切都取决于上下文。

      【讨论】:

      • 我认为你的答案可能是我正在寻找的。您能否扩展您的最后一句“最后,您可能想要初始化某种图表,然后您可以使用 Vue.js 观察程序或在 API 的 then() 块中对其进行初始化。” ?我更新了我的帖子以显示整个组件。
      • 你的最后一句话是关键。但是,下面提供了 Keja 的答案以及示例和参考网址。如果我能给你们俩一些信任,我会的。不过谢谢。
      • @Jessi,就像 Keja 提到的那样。我只是在我的回答中详细说明了它。请看一下,如果您有任何问题,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2019-12-02
      • 2015-12-19
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多