为什么axios请求的数据无法第一次拿到?

发布于 2022-09-11 23:51:45 字数 1645 浏览 14 评论 0

问题描述

在本地搭建了一个easy-mock的服务,提供API模拟。然后学习使用axios和vuex做了一个响应式的网站,遇到一个问题,页面打开的第一次数据是无法取到,但是刷新一下页面数据就有了,然后点击导航进入其他栏目也有这样的现象。

问题出现的环境背景及自己尝试过哪些方法

/*
   Home.vue 网站首页
*/

<script>
export default {
  name: "Home",
  data() {
    return {
      articles: [],
    };
  },
  created() {
    this.$store.dispatch("loadHomeData");
  },
  mounted() {
    this.articles = this.$store.state.homeData;
  },
  activated() {
    //发起数据请求
    this.$store.dispatch("loadHomeData");
    this.articles = this.$store.state.homeData;
  },

};
</script>
/*
    store/index.js
*/
import Vue from "vue";
import Vuex from "vuex";
import { Request } from "@/request";
Vue.use(Vuex);
export default new Vuex.Store({
  state: {
    homeData: [],
  },
  mutations: {
    loadHomeData(state, res) {
      state.homeData = res;
    },
  },
  actions: {
    loadHomeData(context) {
      Request("/loadHomeData")
        .then(res => {
          context.commit("loadHomeData", res.data.articles);
        })
        .catch(err => {
          console.log(err);
        });
    },
  }
});
/*
    Request/index.js
*/
import axios from "axios";

export function Request(config) {
  const instance = axios.create({
    method: "get",
    baseURL: "http://192.168.0.222:7300/mock/5ddb933eb7f02e2ea33aca08/api/",
    timeout: 3000
  });
  return instance(config);
}

在组件的created声明周期发起数据请求,
mounted周期里,将在state里面的数据再给到组件的data部分。
整个思路就是在页面created-dispath->actions->mutation->mouted(state->组件data)->组件渲染。
但是,问题是只有刷新过页面之后数据才会到组件的data.
应该如何修改?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

熟人话多 2022-09-18 23:51:45

vue初始化时执行的声明周期函数都是同步,你请求数据是一个异步任务(宏任务),所以其实在mounted里获取到store里的homeData还是初始的值,因为同步脚本还没有执行完,axios请求回调函数还没有执行;换句话说就是homeData数据还没更新,所以mounted里赋的值还是旧值;然后问题中提到刷新页面后数据又正常了,我理解你这里指的刷新是重定向到其他路由,然后在返回home页面,数据出来是因为在上一次进入页面后数据确实加载了,但是由于异步的原因导致mounted里的赋值是无效的,但是当你再次进入home里,activated重新执行(你应该用了keep-alive),而此时store的数据已经更新了,所以这一次赋值成功了

解决方案:
不需要声明data里的字段了,直接使用computed选项,如下

/*
   Home.vue 网站首页
*/

<script>
export default {
  name: "Home",
  data() {
    return {
    };
  },
  computed: {
    articles() {
        return this.$store.state.homeData;
    }
  }
  created() {
    this.$store.dispatch("loadHomeData");
  },
  activated() {
    //发起数据请求
    this.$store.dispatch("loadHomeData");
  },

};
</script>
不知在何时 2022-09-18 23:51:45

this.$store.state.homeData放在computed钩子里试试

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文