• 十、Vue Router 进阶获取数据


    获取数据的两种方式

    • 导航完成之后获取数据:先完成导航,然后在接下来的组件生命周期钩子created中获取数据。在数据获取期间展示一个loading加载中的状态提示。

    • 导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。

    导航完成之后获取数据(可展示loading)

    在组件的created钩子中获取数据。在获取数据期间展示一个loading状态,可以在不同视图间展示不同的loading状态。

    <template>
    	<div class="post">
        	<div class="loading" v-if="loading">Loading...</div>
        	<div class="error" v-if="error">{{ error }}</div>
        	<div class="content" v-if="post">
            	<h2>{{ post.title }}</h2>   
            	<p>{{ post.body }}</p>   
        	</div>
        </div>
    </template>
    
    <script>
    export default {
        data() {
            return {
                loading: false,
                post: null,
                error:null
            }
        },
        created () {
            // 组件创建完成后获取数据
            this.fetchData();
        },
        watch: {
            // 路由发生变化,会再次执行该方法
            "$route": 'fetchData'
        },
        methods: {
            fetchData () {
                this.error = this.post = null;
                this.loading = true
                // 发送请求 - 获取动态数据
                getPost(this.$route.params.id, (err, post) => {
                	this.loading = false;
                    if(err){
                        this.error = err.toString();
                    }else{
                        this.post = post;
                    }
                });
            }
        }
    }
    </script>
    
    

    在导航前获取数据(不能添加loading提示)

    在导航转入新的路由前获取数据,可以在组件的beforeRouteEnter守卫中获取数据,当数据获取成功之后调用next方法进入页面。当页面导航变化时,在beforeRouteUpdate钩子函数获取数据。

    <script>
    export default {
        data() {
            return {
                post: null,
                error: null
            }
        },
        beforeRouteEnter (to, from, next) {
            // 在确定进入路由之前获取数据,当数据获取成功则确定进入路由
            getPost(to.params.id, (err, post) => {
            	next(vm => vm.setData(err, post)); 
            });
        },
        // 路由更新时重新获取数据
        beforeRouteUpdate(to, from, next) {
        	this.post = null;
        	getPost(to.params.id, (err, post) => {
            	this.setData(err, post);
            	next();
        	});
    	},
        methods: {
            setData (err, post) {
                if(err) {
                    this.error = err.toString();
                }else{
                    this.post = post;
                }
            }        
        }
    }
    </script>
    
  • 相关阅读:
    Ubuntu下RabbitMq 安装与运行
    web_api所需包
    Ubuntu16.04下安装python3.6.4详细步骤
    JavaScript
    css
    html
    MySQL
    day4 函数
    day3 字典,集合,文件
    day2
  • 原文地址:https://www.cnblogs.com/yuxi2018/p/11967285.html
Copyright © 2020-2023  润新知