导航完成之前获取

1、beforeRouteEnter(to, from, next):在渲染该组件的对应路由被验证前调用,也就是刚进入路由之前调用。

2、beforeRouteUpdate(to, from, next):在当前路由改变,但是该组件被复用时调用,也就是当路由参数改变时调用。

3、beforeRouteLeave(to, from, next):在导航离开渲染该组件的对应路由时调用,也就是切换路由时调用。

4、created():在组件创建完成后调用。

    <div id="app"></div>
    <script type="text/javascript" src="./vue.js"></script>
    <script type="text/javascript" src="./vue-router.js"></script>
    <script type="text/javascript" src="./axios.js"></script>
    <script type="text/javascript">
        Vue.use(VueRouter)
        var User = {
            data(){
                return{
                    user:'',
                    error:null,
                    timer:null,
                    num:0,
                    msg:'', // 输入框中输入的内容
                    msg1:'', // 页面中展示的数据
                    confir:true
                }
            },
            template:` 
                <div>
                    <div>{{num}}</div>
                    <input type="text" v-model='msg' />
                    <p>{{msg1}}</p>
                    <button @click='save'>保存</button>
                    <div v-if="error" class="error">
                        {{error}}
                    </div>
                    <div class="user" v-if="user">
                        <h2>{{user}}</h2>
                    </div>
                </div>
            `,
            methods:{
                setDatas(user){
                    this.user = user;
                },
                setError(err){
                    this.err = err;
                },
                save(){
                    this.msg1 = this.msg;
                    this.msg = '';
                    this.confir = true;
                }
            },
            created(){
                // 定时器
                this.timer = setInterval(()=>{
                    console.log(this.num);
                    this.num += 1;
                }, 1000)
            },
            beforeRouteEnter(to, from, next) {
                // 在渲染该组件的对应路由被验证前调用
                // 不能获取组件实例 `this` !
                // 因为当守卫执行时,组件实例还没被创建!
                console.log('beforeRouteEnter路由被验证前调用');
                console.log(to);
                axios.get(`http://127.0.0.1:8888/user/${to.params.id}`)
                .then(res=>{
                    // console.log(this);
                    next(vm=>vm.setDatas(res.data));
                })
                .catch(err=>{
                    next(vm=>vm.setError(err))
                });
            },
            beforeRouteUpdate(to, from, next) {
                // 在当前路由改变,但是该组件被复用时调用
                // 举例来说,对于一个带有动态参数的路径 `/users/:id`,在 `/users/1` 和 `/users/2` 之间跳转的时候,
                // 由于会渲染同样的 `UserDetails` 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
                // 因为在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例 `this`
                console.log('beforeRouteUpdate前路由改变,但是该组件被复用时调用');
                console.log(to);
                this.user = null;
                axios.get(`http://127.0.0.1:8888/user/${to.params.id}`)
                .then(res=>{
                    this.setDatas(res.data);
                    next();
                })
                .catch(err=>{
                    this.setError(err.data);
                    next();
                });
            },
            beforeRouteLeave(to, from, next) {
                // 在导航离开渲染该组件的对应路由时调用
                // 与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this`
                console.log('beforeRouteLeave离开渲染该组件的对应路由时调用');
                clearInterval(this.timer);
                console.log('你离开了');
                if(this.confir == true && this.msg){
                    // 证明用户输入了内容 需要提示用户保存重要信息
                    this.confir = confirm('请求保存重要信息'); //用户点击了取消按钮返回值为false
                    next(false);
                }else if(this.confir == false){
                    alert('请保存信息后退出');
                    next(false);
                }else{
                    next();
                }
            },
        } 
        // 我是测试组件
        var Test = {
            template:` 
                <div>我是测试组件</div>
            `
        }
        // 路由的配置
        var router = new VueRouter({
            routes:[
                {
                    path:'/test',
                    name:'test',
                    component: Test
                },
                {
                    path:'/user/:id',
                    name:'user',
                    component: User
                }
            ]
        });
        // 入口组件
        var App = {
            template:` 
                <div>
                    <router-link :to="{name:'test'}">测试</router-link>
                    <router-link :to="{name:'user', params:{id:1}}">我是用户1</router-link>
                    <router-link :to="{name:'user', params:{id:2}}">我是用户2</router-link>

                    <router-view></router-view>
                </div>
            `
        };
        Vue.prototype.$axios = axios;
        new Vue({
            el:'#app',
            template:'<App/>',
            data(){
                return{
                }
            },
            components:{
                App
            },
            router
        });
    </script>

 

posted @ 2022-11-21 10:08  炒股沦为首负  阅读(19)  评论(0编辑  收藏  举报