账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Vue生命周期内发起ajax请求,因为请求异步性,并且生命周期函数也是异步的,导致子组件获取结果滞后,如果才能保证同步?
    60
    0

    1、项目有这样的需求、或者是设计吧。项目在浏览器一打开,初始化时需要向服务端发起请求,获取初始化参数,而这些参数需要在所有的子模块(组件)中需要用到。
    2、现在的实现思路是在main.js中,在created钩子函数发起请求,将结果存放在vuex中用于各个模块共享。其他子模块在mounted钩子函数中拿取vuex中的参数,再进行其他处理。各个模块通过路由链接。但是因为axios请求的异步性,导致子组件开始mounted时,之前的请求结果还没返回。
    3、后来在试着在main.js的created钩子函数中使用await async promise等机制来保证同步,后来还是不行,await async 不能阻塞vue生命周期钩子函数的执行。这就导致获取数据一直滞后。
    4、有大神能提供解决方法嘛?或者我的思路有问题?

    5、main.js:

    new Vue({
        render: h => h(App),
        store: store,
        methods: {
            async seturl() {
    
            },
            get() {
                var _this = this;
                return new Promise((resolve) => {
                    _this.$axios.get(require.systemInfo).then(function (response) {
                        resolve(response.data)
                    }).catch(function (err) {
    
                    })
                })
            },
            b() {
                window.console.log("处理后面的函数!")
            }
        },
    
        async created () {
    
            window.console.log("开始发送请求!")
            var v = await this.get();
            window.console.log(v)
            this.$store.commit('setUrls', v);
            this.b();
    
            /*this.iserverUrl = this.$store.state.AppInformation.urls.iserver;*/
        }
    }).$mount('#app')
    
    
    
    
    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 蜡笔大辛 普通会员 1楼

      在Vue生命周期内发起Ajax请求,并且请求异步性,可能会导致子组件获取结果滞后。为了解决这个问题,可以采用Vue的状态管理机制,或者在父组件和子组件之间使用Vue的事件循环来实现同步。以下是一个简单的示例:

      1. 在父组件中,首先创建一个状态对象来存储数据:

      javascript export default { data() { return { data: 'Hello Vue!' }; }, mounted() { this.fetchData(); }, methods: { fetchData() { this.$http.get('/api/data') .then(response => { this.data = response.data; }) .catch(error => { console.error(error); }); } } };

      1. 在子组件中,使用Vue的$emit事件来触发请求,并在子组件中处理返回的数据:

      javascript export default { template: `<div>{{ data }}</div>` };

      1. 在父组件中,使用Vue的$emit事件来触发请求,并在子组件中处理返回的数据:

      javascript export default { components: { ChildComponent: { template: `<ChildComponent :data="data"></ChildComponent>` } }, mounted() { this.$emit('fetchData'); } };

      在这个示例中,父组件在mounted生命周期钩子中发起Ajax请求,并在ChildComponent中处理返回的数据。这样,由于请求异步性,结果会稍后才返回,从而避免了子组件获取结果滞后的问题。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部