Vue-Router学习__Part01

$refs的使用

  var App2 = {
        template: `<div>
                        <h1>我是App2</h1>
                        <button ref="btn">按钮3</button>
                    </div>`,
    }
    // 注册
    var App = {
        template: `<div>
                        <h1>我是App</h1>
                        <button ref="btn">按钮1</button>
                        <App2 ref="ap2"></App2>
                    </div>`,
        components:{
            App2
        },
        mounted(){
            // 如果给标签绑定ref="xxx",可以使用this.$refs.xxx获取原生的domjs对象
            console.log(this.$refs.btn)
            // 如果给组件绑定ref="xxx",可以使用this.$refs.xxx获取这个组件对象
            console.log(this.$refs.ap2)
        }
    }

$nextTick

在dom更新之后refs没法获取到dom更新之后的元素,因此提供了nextTick方法

 // 注册
    var App = {
        data(){
          return{
              isShow:false
          }
        },
        template: `<div>
                        <h1>我是App</h1>
                        <button ref="btn">按钮1</button>
                        <App2 ref="ap2"></App2>
                        <input type="text" v-show="isShow" ref="input">
                    </div>`,
        components:{
            App2
        },
        mounted(){
            
            // 如果给标签绑定ref="xxx",可以使用this.$refs.xxx获取原生的domjs对象
            console.log(this.$refs.btn)
            // 如果给组件绑定ref="xxx",可以使用this.$refs.xxx获取这个组件对象
            console.log(this.$refs.ap2)

            this.isShow = true
            //在dom更新循环结束后的执行的回调函数,
            // 在修改数据之后使用此方法在回调中获取更新后的dom
            this.$nextTick(()=>{
                    console.log(this)
                    this.$refs.input.focus()
                }
            )
        }
    }

使用vue-Router

原生JS的调用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href="#/login">登录</a>
    <a href="#/register">注册</a>

    <div id="app"></div>
    <script type="text/javascript">
        var oDiv = document.getElementById('app')

        // 监控hash值的变化
        window.onhashchange = function () {
            console.log(location.hash)
            switch (location.hash) {
                case '#/login':
                    oDiv.innerHTML = '<h2>我是登录页面</h2>'
                    break
                case '#/register':
                    oDiv.innerHTML = '<h2>我是注册页面</h2>'
                    break
                default:
                    break
            }
        }

    </script>
</body>
</html>

使用路由简单实现(锚点跳转)
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
    <script src="../vue.js"></script>
    <script src="../vue-router.js"></script>
</head>
<body>
<div id="app" >
    <App></App>
</div>

<script>
    //让vue使用vue-router
    Vue.use(VueRouter)

    //创建Login对象
    var Login = {
        template: `
            <h2>我是登录页面</h2>
        `
    }

    //创建Register对象
    var Register = {
        template: `
            <h2>我是注册页面</h2>
        `
    }

    //创建vue-router对象
    var router = new VueRouter({
        //配置路由
        routes:[
            //路由匹配规则,路径加子组件名
            {
                path:"/login",
                component:Login,
            },
            {
                path:"/register",
                component:Register,
            }
        ]
    })

    // 使用router-link 他最终会被渲染成a标签
    // router-view 相当于一个占位符,用于展示被匹配路径匹配到的组件中的内容(路由组件的出口)
    var App = {
        template: `<div>
                         <router-link to="/login">登录</router-link>
                         <router-link to="/register">注册</router-link>
                         <router-view></router-view>
                    </div>`,
    }

    // 创建根实例
    new Vue({
        el: '#app',
        data:{
            messagec:'我是祖父组件的数据',
        },
        components: {
            App
        },
        //吧router交给根组件管理
        router:router
        // template:`<App message="hello" :texts="messagec" @getHeaderData="getDataMethod"></App>`
    })
</script>
</body>
</html>
步骤

1.引入并注册vueRouter

    <script src="../vue-router.js"></script>

    //让vue使用vue-router
    Vue.use(VueRouter)

2.创建App和2个子组件
3.创建router对象,使用路由进行关联

    //创建vue-router对象
    var router = new VueRouter({
        //配置路由
        routes:[
            //路由匹配规则,路径加子组件名
            {
                path:"/login",
                component:Login,
            },
            {
                path:"/register",
                component:Register,
            }
        ]
    })

4.在App中使用router-link和router-view

    // 使用router-link 他最终会被渲染成a标签
    // router-view 相当于一个占位符,用于展示被匹配路径匹配到的组件中的内容(路由组件的出口)
    var App = {
        template: `<div>
                         <router-link to="/login">登录</router-link>
                         <router-link to="/register">注册</router-link>
                         <router-view></router-view>
                    </div>`,
    }

命名路由

  • 路由加名字,to变属性:to,参数传字典
    //路由匹配规则,路径加子组件名
            {
                path:"/login",
                name:"login",
                component:Login,
            },
        
     <router-link :to="{name:'login'}">登录</router-link>

路由传参

路由范式
  • xxxx.html#/user/1 params 动态路由参数
  • oooo.html#/user?userId=1 query

路由

//创建vue-router对象
    var router = new VueRouter({
        //配置路由
        routes:[
            //路由匹配规则,路径加子组件名
            //动态路由参数,以:开头
            {
                path:"/login/:id",
                name:"login",
                component:Login,
            },
            {
                path:"/register",
                name:"register",
                component:Register,
            }
        ]
    })

匹配

  // 使用router-link 他最终会被渲染成a标签
    // router-view 相当于一个占位符,用于展示被匹配路径匹配到的组件中的内容(路由组件的出口)
    var App = {
        template: `<div>
                         <router-link :to="{name:'login',params:{id:1}}">登录</router-link>
                         <router-link :to="{path:'/register',query:{userId:2}}">注册</router-link>
                         <router-view></router-view>
                    </div>`,
    }

子组件获取路由参数

使用$router获取路由参数

   //创建Login对象
    var Login = {
        template: `
            <h2>我是登录页面</h2>
        `,
        created(){
            // 当引入vuerouter后,会将这2个对象挂载到根部vue实例化对象中
            // 而组件具有继承性,所有这个组件也能拿到这2个对象
            console.log(this.$router) //vuerouter对象
            console.log(this.$route) //创建的routes路由
            console.log(this.$route.params.id) //创建的routes路由
        }
    }

    //创建Register对象
    var Register = {
        template: `
            <h2>我是注册页面</h2>
        `,
        created(){
            // 当引入vuerouter后,会将这2个对象挂载到根部vue实例化对象中
            // 而组件具有继承性,所有这个组件也能拿到这2个对象
            console.log(this.$router) //vuerouter对象
            console.log(this.$route) //创建的routes路由
            console.log(this.$route.query.userId) //创建的routes路由
        }
    }

路由嵌套

一个router-view中嵌套另一个router-view
  • 登录路由中
{
                path:"/login/:id",
                name:"login",
                component:Login,
                children:[
                    {
                        path:"main",
                        name:"main",
                        component:Main,
                    },
                    {
                        path:"main2",
                        name:"main2",
                        component:Main2,
                    }
                ]
            },
  • 登录vue对象中
    //创建Login对象
    var Login = {
        template: `
            <div>
                    <h2>我是登录页面</h2>
                    <router-link to="/login/1/main">主页1</router-link>
                    <router-link :to="{name:'main2',params:{id:1}}">主页2</router-link>
                    <router-view></router-view>
<!--                    <Main></Main>-->
            </div>
        `,
        created(){
            // 当引入vuerouter后,会将这2个对象挂载到根部vue实例化对象中
            // 而组件具有继承性,所有这个组件也能拿到这2个对象
            console.log(this.$router) //vuerouter对象
            console.log(this.$route) //创建的routes路由
            console.log(this.$route.params.id) //创建的routes路由
        },
        components:{
            Main,
            Main2
        }
    }
  • 创建2个子路由模板
    //创建Main对象
    var Main = {
        template: `
            <h2>我是主页面1</h2>
        `,
        created(){
            // 当引入vuerouter后,会将这2个对象挂载到根部vue实例化对象中
            // 而组件具有继承性,所有这个组件也能拿到这2个对象
            console.log('main1-----------')
            console.log(this.$router) //vuerouter对象
            console.log(this.$route) //创建的routes路由
            // console.log(this.$route.query.userId) //创建的routes路由
        }
    }

    //创建Main对象
    var Main2 = {
        template: `
            <h2>我是主页面2</h2>
        `,
        created(){
            // 当引入vuerouter后,会将这2个对象挂载到根部vue实例化对象中
            // 而组件具有继承性,所有这个组件也能拿到这2个对象
            console.log('main2-----------')
            console.log(this.$router) //vuerouter对象
            console.log(this.$route) //创建的routes路由
            // console.log(this.$route.query.userId) //创建的routes路由
        }
    }

注意:会在加载时默认匹配path中的第一个路由

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值