【问题标题】:How to initiate a function using data(){} but not mounted(){} while using vue-resource如何在使用 vue-resource 时使用 data(){} 但不使用 mount(){} 来启动函数
【发布时间】:2017-12-11 20:08:23
【问题描述】:

这可行,但我需要使用mounted(){} 来启动我认为可以避免但不确定如何避免的功能。

<script>
  export default {
    data () {
      return {
        domains: [],
      }
    },

    methods: {
      fetchDomains() {
        let _this = this;

        api._get({url: 'api/domains'})
          .then(function (response) {
            _this.domains = response.data;
          })
      }
    },

    mounted() {
      this.fetchDomains()
    }
  }
</script>

这段代码不起作用,但我喜欢做这样的事情。在data(){} 本身中启动函数。

<script>
  export default {
    data () {
      return {
        domains: this.fetchDomains(),
      }
    },

    methods: {
      fetchDomains() {
        let data = [];

        api._get({url: 'api/domains'})
          .then(function (response) {
            data = response.data;
          })

        return data
      }
    }
  }
</script>

提前致谢。

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-resource


    【解决方案1】:

    我可能稍微偏离了这个问题(因为它明确提到了data 属性),但我认为这可能会有所帮助。就个人而言,如果我想提供一些具有更复杂逻辑的数据,我会使用computed 属性。我认为这很棒,您可以在the docs 中阅读更多相关信息。这种情况下的问题是它不能完全按预期使用异步操作...

    但是,有一个可爱的小模块叫做 vue-async-computed,可以在 here 找到。它通过提供asyncComputed 属性解决了这个特定问题,并保持代码非常干净!

    【讨论】:

      【解决方案2】:

      我同意 Decade Moon 的观点,即您的第一种方法是更好的方法(尽管您可以使用 created 而不是 mounted)。

      您的第二种方法不起作用的原因是您返回一个数组,然后用不同的数组替换局部变量的值。您需要做的是填充您返回的数组。

      new Vue({
        el: '#app',
        data() {
          return {item: this.getItem()}
        },
        methods: {
          getItem() {
            let val = [];
            setTimeout(() => {
              const result = ['first','second','third'];
              val.push(...result);
            }, 800);
            return val;
          }
        }
      });
      <script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>
      <div id="app">{{item}}</div>

      【讨论】:

        【解决方案3】:

        您的第一个代码 sn-p 是正确的方法。

        您无法使用来自 API 响应的数据初始化 domains,因为它是一个异步操作,在未来某个时间点(在组件安装之后)可能会或可能不会成功解决。您可能还想执行其他操作,例如使用在请求期间设置为 trueloading 属性跟踪异步操作。

        您的组件最初将处于加载状态,还没有任何domains 数据,您需要考虑这一点。在此期间显示加载微调器或其他东西。

        【讨论】:

        • 正确的建议,在技术上不是完全正确的答案。他的第二个方法可以工作,因为它返回一个将异步填充的变量,但诀窍是填充他设置的数组,而不是替换它。
        猜你喜欢
        • 2017-04-09
        • 2015-11-11
        • 2021-06-17
        • 2011-03-29
        • 2016-10-24
        • 2020-11-02
        • 2017-11-20
        • 2018-07-31
        • 2016-01-27
        相关资源
        最近更新 更多