【问题标题】:Vuejs axios variable assignation after call调用后Vuejs axios变量赋值
【发布时间】:2018-06-29 00:29:25
【问题描述】:

我想从 mixin 中使用 this.request(url) 调用 axios(以简化和集中同一文件中有关 axios 的所有内容),但它不起作用。

Vue 文件:

export default {
  name: "employees-list",
  data() {
    return {
      employees: []
    }
  },
  mounted() {
    this.employees = this.request('https://jsonplaceholder.typicode.com/posts');
  }
}

Request.js

Vue.mixin({
  methods: {
    request: function (url) {
      axios.get(url)
        .then(response => {
        return response.data
      })
        .catch(e => {
        this.errors.push(e)
      })
    }
  }
});

员工是“未定义的”。

我认为问题是异步或等待,但我不明白。

【问题讨论】:

    标签: javascript vue.js vuejs2 axios


    【解决方案1】:

    看起来您希望 mixin 创建一个通用方法来检索数据。在这种情况下,您需要从request 方法返回promise,并在成功回调中处理结果数据。

    这是一个工作示例。

    console.clear()
    
    const EmployeesList = {
      name: "employees-list",
      template: `
          <ul>
            <li v-for="employee in employees">{{employee.title}}</li>
          </ul>
        `,
      data() {
        return {
          employees: []
        }
      },
      mounted() {
        // obviously using posts here as an example instead of 
        // employees.
        this.request('https://jsonplaceholder.typicode.com/posts')
          // handle the promise success
          .then(e => this.employees = e);
      }
    }
    
    Vue.mixin({
      methods: {
        request: function(url) {
          // return the promise
          return axios.get(url)
            .then(response => {
              return response.data
            })
            .catch(e => {
              this.errors.push(e)
            })
        }
      }
    });
    
    new Vue({
      el: "#app",
      components: {
        EmployeesList
      }
    })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.17.1/axios.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
    
    <div id="app">
      <employees-list></employees-list>
    </div>

    【讨论】:

    • 非常了解 OP 的需求和意图,很好的解释和漂亮的代码。
    【解决方案2】:

    试试这个:

    new Vue({
        el: '#root',
      data: {
        employees: []
      },
      methods: {
        request(url){
            return new Promise((resolve, _) => {
            axios.get(url)
              .then(res => {
                resolve(res);
              }).catch(err => {
                // err management
              });
          });   
        }
      },
      mounted(){
       this.request('https://jsonplaceholder.typicode.com/posts').then(res => {
        this.employees = res;
       })
      }
    })
    

    【讨论】:

    • employees 具有“承诺”价值,但是当我这样做时:
    • {{employee.title}}
    • 它不起作用
  • 我更改了我的帖子。它现在应该更适合你@alxb
  • 我认为它会工作,但它的代码太多了。我只想在一个外部文件中包含有关 axios 的所有内容,以便在我的 vue 文件中执行一个简单的调用 this.request() 。我不想为每个 vue 文件 axios.get.... 在方法上。你看到我想做什么了吗?最终目标是我只想在一行中执行 this.request(url) 并让请求函数进行错误管理等...
  • 抱歉之前有点瞎。 :D 现在它应该可以正常工作了
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签