将承诺绑定到 Vue 中的组件

bind a promise to component in Vue

App.vue

<template>
  <v-app>
    <v-main>
      <Header :token="token" :users="users"/>
      <router-view/>
    </v-main>
  </v-app>
</template>

<script>
import Header from './components/layout/Header'
import axios from 'axios';

export default {
  name: 'App',
  components: {
    Header
  },
  data() { 
    return { token: null, users: [] };
  },
  created(){
    this.token = this.getToken();
    this.users = this.getUsers();
  },
  methods:{
    getToken(){
      axios.get("http://someURL.com")
        .then(res => {
          console.log("token = ", res)
          return res;
        });
    },
    getUsers(){
      axios.get("http://someURL.com")
        .then(res => {
          let users = res.data.map(({username}) => username);
            console.log("users = ", users)
            return users;
        });
    }
  }
};
</script>

Header.vue

<template>
    <header class="header">
        <v-toolbar dark>
            <h1>TITLE</h1>
            
            <v-spacer></v-spacer>

            <div>
                <router-link to="/">Home</router-link> |
                <router-link to="/about">About</router-link>
            </div>
        </v-toolbar>

        <p v-if="users">{{users}}</p>
        <p v-else>No Data</p>

    </header>
</template>

<script>
export default {
    name:"Header",
    props: ['token', 'users'],
    data: () => ({
    }),
    mounted(){
        this.onStart();
    },
    methods:{
        onStart(){
            console.log("insideHeader = ", this.users)
        }
    }
}
</script>

<style scoped>
    #nav{
        float: right;
    }
    .header a{
        color: #fff;
        padding-right: 5px;
        text-decoration: none;
    }
</style>

所以基本上我的问题是,我正在使用 axios 在 App.vue 上获取一些数据,然后将该数据绑定到 Header.vue,因此当应用程序首先加载时,绑定值将是未定义的,仅在一段时间后,数据才从 API 中获取。但即便如此,该值在 Header 中仍未定义。有什么解决办法吗?

不要尝试 return 来自 promise 回调的值,您可以使用 async/await 到 return 响应:

<template>
  <v-app>
    <v-main>
      <Header :token="token" :users="users"/>
      <router-view/>
    </v-main>
  </v-app>
</template>

<script>
import Header from './components/layout/Header'
import axios from 'axios';

export default {
  name: 'App',
  components: {
    Header
  },
  data() { 
    return { token: null, users: [] };
  },
  created(){
    this.token = this.getToken();
    this.users = this.getUsers();
  },
  methods:{
    async getToken(){
     let res=await axios.get("http://someURL.com")
       
          console.log("token = ", res)
          return res.data;
      
    },
   async getUsers(){
     let res=await axios.get("http://someURL.com")
       
          let users = res.data.map(({username}) => username);
            console.log("users = ", users)
            return users;
       
    }
  }
};
</script>

Api 调用本质上是异步的。因此利用 async/await..

<template>
  <v-app>
    <v-main>
      <Header :token="token" :users="users"/>
      <router-view/>
    </v-main>
  </v-app>
</template>

<script>
import Header from './components/layout/Header'
import axios from 'axios';

export default {
  name: 'App',
  components: {
    Header
  },
  data() { 
    return { token: null, users: [] };
  },
  async created(){
    this.token = await this.getToken();
    this.users = await this.getUsers();
  },
  methods:{
    getToken(){
      return axios.get("http://someURL.com")
        .then(res => {
          console.log("token = ", res)
          return res.data;
        });
    },
    getUsers(){
      return axios.get("http://someURL.com")
        .then(res => {
          let users = res.data.map(({username}) => username);
            console.log("users = ", users)
            return users;
        });
    }
  }
};
</script>