vue.js学习(四)

Vue,js 高博文
文章标签: vue.js

vue.js学习(四)

Vue Router(路由)构建单页程序

①路由是Vue.js的核心组件,通过路由器可以构建用户体验较高的单页应用程序。

②使用VueRouter构建一个单页应用程序

在heml中要引入脚本Vue.js和VueRouter.js文件,定义导航组件<router-link>,渲染与路由匹配的组件内容<router-view>

在js中步骤是定义组件信息,使用数字定义路由列表、实例化路由、实例Vue对象。实例化路由是挂载在Vue对象上的。

<body>
    <div id="app">
        <h1>路由的定义</h1>
       <div>
           <router-link to="/stu">学生</router-link>
           <router-link to="/tea">老师</router-link>
       </div>
       <div>
           <router-view></router-view>
       </div>
    </div>
</body>
<script>
    //创建学生组件
    var  stu={
        template:`<div>学生界面</div>`
    }
    //创建老师组件
    var tea={
        template:`<div>这是一个老师界面</div>`
    }
    //创建路由对象
    var routers=[{path:"/stu",component:stu},{path:"/tea",component:tea}]
   //实例路由器
   var router=new VueRouter({routes:routers});
   var vm=new Vue({
       el:"#app",
       router:router,
   })
</script>

③动态路由

可以动态改变路由信息,在组件上需要从外面传递参数来做相应的处理时,参数信息可以通过动态路由来传递。

<body>
    <div id="app">
        <h3>动态路由</h3>
        <div>
            <router-link to="/user/stu/100">学生</router-link>
            <router-link to="/user/tea/10">老师</router-link>
        </div>
        <div>
            <router-view></router-view>
        </div>

       
    </div>
    <script>
    //创建组件
    var user={
        template:`<div>我是一个{{$route.params["name"]=="stu"?"学生":"老师"}} id={{id}}</div>`,
        props:["id"]
    }
    //定义路由
    var routes=[{path:"/user/:name/:id",component:user,props:true}]
    //实例路由
    var router=new VueRouter({routes})
    var vn=new Vue({
        el:"#app",
        router,
    })
    </script>

path路径在"/user/:name"在路由上使用冒号(:)标记一个路由参数,可以理解为方法上的一个参数。在组件上可以使用this.$route.params根据参数名获取参数值。

④编程式导航的几个常见方法

router.push(location,onComplete?,onAbort?)是使用在事件的方法中

<body>
    <div id="app">
        <h3>编程式导航</h3>
        <button @click="sturou">学生</button>
        <button @click="tearou">老师</button>
        <router-view></router-view>
    </div>
    <script>
        // //创建学生组件
        // var stu = {
        //     template: `<div>学生界面</div>`
        // }
        // //创建老师组件
        // var tea = {
        //     template: `<div>这是一个老师界面</div>`
        // }
        //创建路由对象
       // var routers = [{ path: "/stu", component: stu ,name:"政委"}, { path: "/tea", component: tea ,name:"首长"}]




        //命名路由
        var user={
        template:`<div>我是一个{{$route.params["name"]=="stu"?"学生":"老师"}} id={{id}}  ids={{$route.query.ids}}</div>`,
        props:["id"]
    }
        var routers = [{ path: "/user/:name/:id", component: user ,name:"政委",props:true}]
        //实例路由器
        var router = new VueRouter({ routes: routers });
        var vm = new Vue({
            el: "#app",
            router: router,
            methods: {
                sturou() {
                    //用字符串查找路径
                //  router.push("/stu")
                //用对象查找路径,根据对象中属性查找路由对象中对应的属性
               // router.push({name:"政委"})
               //命名的路由
            //    router.push({name:"政委",params:{name:"stu",id:100}})
               //带查询参数
                    router.push({path:"/user/stu/100",query:{ids:88}})
                },
                tearou() {
                    //router.push("/tea")
                    //router.push({name:"首长"})
                //    router.push({name:"政委",params:{name:"tea",id:10}})

                     router.push({path:"/user/tea/10",query:{ids:99}})  
                }
            }
        })
    </script>
</body>

router.replace(location,onComplete?,onAbort?)是使用在事件的方法中与router.push使用方法是一样的,只是replace没有历史地址及history,而push有历史地址。

router.go(num)直接跳转到历史记录中的num个地址,num为0是就是刷新跳转到当前地址,为负数时就是后退多少,为正数时就是前进多少。


⑤导航守卫(路由的构造函数)

<body>
    <div id="app">
        <button @click="teas">老师</button>
        <button @click="stus">学生</button>
        <router-view></router-view>
    </div>
    <script>
        var zujian = {
            template: `
        <div>我是{{$route.params["name"]=="stu"?"学生":"老师"}},id={{id}}   ids={{$route.query.ids}}</div>
        `,
            props: ["id"]
        }
        var routes = [{ path: "/user/:name/:id", component: zujian, props: true }]
        var router = new VueRouter({ routes: routes })
        router.beforeEach((to, from, next) => {//全局前置守卫  在路由渲染前调用的钩子函数
            console.log("前");
            next();//在这里进行判断是否渲染 如果渲染则调用next(),不渲染则不调用
        })
        // router.afterEach((to, from, next) => {//全局后置守卫  在路由渲染后调用的钩子函数  不接受next函数不会改变导航本身
        //     console.log("后")
        // })
        //路由独享的守卫 就是在实例路由对象中添加beforeEnter((to,from,next)=>{...})  和全局前置一样..
        


        //组件内的守卫
        // const Foo = {
        //     template: `...`,
        //     beforeRouteEnter(to, from, next) {
        //         // 在渲染该组件的ù应路由被 confirm 前调用
        //         // 不!能!获取组件ž例 `this`
        //         // 因为当ˆ卫执行前,组件ž例还没被创建
        //         //  不过可以通过回调函数来获取,代码如下:
        //         /*
        //         beforeRouteEnter (to, from, next) {
        //           next(vm => {
        //             // 通过 `vm` 访问组件实例
        //           })
        //         }
        //         */
        //     },
        //     beforeRouteUpdate(to, from, next) {
        //         // 在当前路由改变,但是该组件被复用时调用
        //         // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
        //         // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
        //         // 可以访问组件实例 `this`
        //     },
        //     beforeRouteLeave(to, from, next) {
        //         // 导航离开该组件的对应路由时调用
        //         // 可以访问组件实例 `this`
        //     }
        // }



        
        var vm = new Vue({
            el: "#app",
            router,
            methods: {
                teas() {
                    router.push({ path: "/user/tea/100", query: { ids: "stu" } })
                },
                stus() {
                    router.push({ path: "/user/stu/80", query: { ids: "tea" } })
                }
            }
        })

    </script>
</body>

还能输出{{restrictNumber}}个字符  
  • {{reply.author}}

    {{CommonUtil.formateDate(reply.ac_CommentDate).shortTime}}
  • 回复了{{Comments.author}} :