Vue路由使用以及组件扩展

1.

  • 接受父组件传值

设置props属性就可以接受父组件传值

父组件传值子组件

  • 设置传递类型

props: {

        // 规定了父组件只能传对象类型

        prop1:Object

        // 可以设置多个类型,可以传Number也可以传String

         parentMsg: [Number, String],

        list: {

            // 设置类型

            type: Array,// [Array,String]

            // 设置默认值的时候必须使用函数,原理和data必须使用函数是一样的

            default: function () {

                    return [{

                        name: '这个一个默认的名字'

                    }]

            }

        },

}

  • 属性的继承和传递

属性继承的特征:

父组件的属性会覆盖子组件的属性

class 和 style 会进行合并,不会覆盖

设置禁用继承

加在子组件上的属性,使用了这个属性之后会阻止组件继承父组件的属性,但是class和style除外

inheritAttrs: false

  • 注意事项 

data和props的区别

data是组件私有的,props是父组件传过来的

data是可以修改的,props是只读的

1.6 子组件传值父组件

子组件调用父组件的方法

  1. 在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)

  2. 子组件可以触发这个事件$emit('事件名字')

子组件给父组件传递数据

  1. $emit方法第二个参数可以定义子组件给父组件传递的内容

  2. 在父组件中怎么拿到这内容

2.1 父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到

2.2 父组件有自定义参数,可以传入$event也可以拿到子组件传递的数据。通过$event只能传递第一个参数。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>组件自定义事件</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <!-- 1.给组件添加事件 -->
    <div id="app">
        <son v-on:click-son='clickParent($event,"自定义参数")' v-on:click-son2='clickParent2'></son>
    </div>
    <template id='sonTemp'>
        <div>
            <button @click='clickSon'>点击事件</button>
            <button @click='clickSon2'>点击事件2</button>
            <h3>这是子组件的内容</h3>
        </div>
    </template>
    <script>
        var son = {
            template: '#sonTemp',
            methods: {
                clickSon() {
                    console.log('子组件的方法');
                    // 2. 在子组件中触发这个事件
                    // 发射,触发
                    // 通过这种方式,子组件也可以给父组件传值
                    this.$emit('click-son', {
                        name: '张三'
                    })
                },
                clickSon2(){
                    console.log('子组件的方法2');
                    this.$emit('click-son2', 'nihao')
                }
            },
        }
        var vm = new Vue({
            el: '#app',
            data: {},
            methods: {
                // e是接受子组件传过来的参数,msg是这个方法自己参数
                clickParent(e, msg) {
                    console.log(e);
                    console.log('父组件的方法,数据为:' + msg);
                },
                clickParent2(e) {
                    console.log(e);
                }
            },
            components: {
                son
            }
        })
    </script>
</body>
</html>
  • 子组件更新后父组件同步更新

  1. 子组件更新数据后,通知父组件

1.1 父组件引用子组件的时候注册一个事件

1.2子组件更新完数据之后调用$emit方法通知父组件

1.8 ref的使用

  • 获取dom节点

  1. 给dom节点记上ref属性,可以理解为给dom节点起了个名字。

  2. 加上ref之后,在$refs属性中多了这个元素的引用。

  3. 通过vue实例的$refs属性拿到这个dom元素。

  • 获取组件

示例:

<router-link to='/login'>登录</router-link>

<router-link to='/registry'>注册</router-link>

路由重定向

redirect可以进行路由的重定向

选中路由高亮

直接设置router-link-active

配置 linkActiveClass:'自定义的类名'

  1. 给组件记上ref属性,可以理解为给组件起了个名字。

  2. 加上ref之后,在$refs属性中多了这个组件的引用。

  3. 通过vue实例的$refs属性拿到这个组件的引用,之后可以通过这个引用调用子组件的方法,或者获取子组件的数据。

  4. 2. Vue中路由的使用

    2.1 什么是路由

  5. 后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源

  6. 前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;

  7. 在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由)

  8. 2.2 如何使用路由

  9. 路由的安装

  10. 引入js文件,这个js需要放在vue的js后面,自动安装(提供了一个VueRouter的构造方法)

  11. 创建路由new VueRouter(),接受的参数是一个对象

  12. 在实例化的对象里配置属性routes:[],这个数组里的对象包含path属性和component属性

  13. path属性是url的地址,component属性就是显示的组件(传组件的对象)

  14. 创建的路由需要和vue实例关联一下

  15. 直接引用官网提供的cdn

    路由的基本使用

  16. 路由到的组件显示在哪个位置<router-view></router-view>

  17. <body>
        <div id="app">
            <!-- 通过路由切换的组件会被放在这里 -->
            <router-view></router-view>
        </div>
        <script>
            const login = {
                template: '<h2>登录</h2>'
            }
            // 这里实例化了一个路由
            const router = new VueRouter({
                routes: [{
                    path: '/login',
                    //这里需要注意的是我们直接组件的对象放在这里
                    component: login
                }]
            });
            var vm = new Vue({
                el: '#app',
                // 把路由挂在到实例上
                router: router
            })
        </script>
    </body>

    路由的跳转

  18. router-link标签可以设置to属性

  19. 默认是a标签,可以通过tag设置包裹标签

  20. 使用默认的样式

  21. 自定义样式

定义参数

通过query的方式在url后加?参数名=参数的值

获取参数:$route.query.参数名

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>路由传递参数</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- 引入这个路由组件之后提供了一个VueRouter的构造方法 -->
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <style>
        .router-link-active {
            background-color: aquamarine;
            font-size: 20px;
        }
        .my-active {
            background-color: aquamarine;
            font-size: 20px;
        }
    </style>
</head>
<body>
    <div id="app">
        <!-- 通过路由切换的组件会被放在这里 -->
        <!-- <a href="#/login">登录</a> -->
        <!-- <a href="#/registry">注册</a> -->
        <!-- 通过router-link 进行路由的跳转 -->
        <!-- 通过tag可以指定router-link渲染的界面元素 -->
        <!-- <router-link to='/login' tag='div'>登录</router-link> -->
        <router-link to='/login?id=123&name=张三'>登录</router-link>
        <router-link to='/registry'>注册</router-link>
        <router-link to='/detail?id=999'>某一篇新闻</router-link>
        <router-view></router-view>
    </div>
    <script>
        // 实现简单路由功能的步骤
        // 1. 引入js文件,这个js需要放在vue的js后面,自动安装(提供了一个VueRouter的构造方法)
           // 2. 创建路由new VueRouter(),接受的参数是一个对象
           // 3. 在实例化的对象里配置属性 routes :[],这个数组里的对象包含path属性和component属性
           // 4. path属性是url的地址,component属性就是显示的组件(传组件的对象)
           // 5. 创建的路由需要和vue实例关联一下
           // 6. 路由到的组件显示在哪个位置<router-view></router-view>
        const login = {
            template: '<h2>登录,父组件传递过来的id{
   
   {$route.query.id}},name:{
   
   {$route.query.name}}</h2>'
        }
        const registry = {
            template: '<h2>注册</h2>'
        }
        const newsDetail = {
            template: '<h2>文章的详情</h2>',
            created() {
                console.log(this.$route.query.id);
                // 根据这个id去请求后台数据,获取完整的新闻内容,之后进行展示
            },
        }
        // 这里实例化了一个路由
        const router = new VueRouter({
            linkActiveClass: 'my-active',
            routes: [{
                path: '/',
                // 通过这种方式,在访问/路径的时候会重定向到/login路径
                redirect: '/login'
            }, {
                path: '/login',
                //这里需要注意的是我们直接组件的对象放在这里
                component: login
            }, {
                path: '/registry',
                component: registry
            }, {
                path: '/detail',
                component: newsDetail
            }]
        });
        var vm = new Vue({
            el: '#app',
            // 把路由挂在到实例上
            router: router
        })
    </script>
</body>
</html>

使用浏览器参数的方式传递参数

3.1 Method实现

3.2 Watch用法

  1. 设置路由的时候/路由地址/:参数名

  2. 获取参数$route.params.参数名

  3. <body>
        <div id="app">
            <!-- 通过路由切换的组件会被放在这里 -->
            <!-- <a href="#/login">登录</a> -->
            <!-- <a href="#/registry">注册</a> -->
            <!-- 通过router-link 进行路由的跳转 -->
            <!-- 通过tag可以指定router-link渲染的界面元素 -->
            <!-- <router-link to='/login' tag='div'>登录</router-link> -->
            <router-link to='/login?id=123&name=张三'>登录</router-link>
            <router-link to='/registry'>注册</router-link>
            <router-link to='/detail/1000'>某一篇新闻</router-link>
            <router-view></router-view>
        </div>
        <script>
          // 实现简单路由功能的步骤
            // 1. 引入js文件,这个js需要放在vue的js后面,自动安装(提供了一个VueRouter的构造方法)
            // 2. 创建路由new VueRouter(),接受的参数是一个对象
            // 3. 在实例化的对象里配置属性 routes :[],这个数组里的对象包含path属性和component属性
            // 4. path属性是url的地址,component属性就是显示的组件(传组件的对象)
            // 5. 创建的路由需要和vue实例关联一下
            // 6. 路由到的组件显示在哪个位置<router-view></router-view>
            const login = {
                template: '<h2>登录,父组件传递过来的id{
         
         {$route.query.id}},name:{
         
         {$route.query.name}}</h2>'
            }
            const registry = {
                template: '<h2>注册</h2>'
            }
            const newsDetail = {
                template: '<h2>文章的详情</h2>',
                created() {
                    console.log(this.$route.params.id);
                    // 根据这个id去请求后台数据,获取完整的新闻内容,之后进行展示
                },
            }
            // 这里实例化了一个路由
            const router = new VueRouter({
                linkActiveClass: 'my-active',
                routes: [{
                    path: '/',
                    // 通过这种方式,在访问/路径的时候会重定向到/login路径
                    redirect: '/login'
                }, {
                    path: '/login',
                    //这里需要注意的是我们直接组件的对象放在这里
                    component: login
                }, {
                    path: '/registry',
                    component: registry
                }, {
                    path: '/detail/:id/:name',
                    component: newsDetail
                }]
            });
            var vm = new Vue({
                el: '#app',
                // 把路由挂在到实例上
                router: router
            })
        </script>
    </body>

    组件的嵌套

  4. 声明路由的时候设置children,这是children是一个数组,数组里是路由对象

  5. 这个children的组件就会渲染在它父组件的<router-view>中

  6. <body>
        <!-- 通过这个路由的嵌套,我们可以实现一些布局 -->
        <div id="app">
            <router-view></router-view>
        </div>
        <template id="parentCompTemp">
            <div>
                <h1>登录注册页面</h1>
                <router-link to='/parent/login'>登录</router-link>
                <router-link to='/parent/registry'>注册</router-link>
                <router-view></router-view>
            </div>
        </template>
        <script>
            const parentComp = {
                template: '#parentCompTemp'
            }
            const login = {
                template: '<h2>登录</h2>'
            }
            const registry = {
                template: '<h2>注册</h2>'
            }
            const newsDetail = {
                template: '<h2>文章的详情</h2>',
                created() {
                    console.log(this.$route.query.id);
                    // 根据这个id去请求后台数据,获取完整的新闻内容,之后进行展示
                },
            }
            // 这里实例化了一个路由
            const router = new VueRouter({
                linkActiveClass: 'my-active',
                routes: [{
                    path: '/',
                    // 通过这种方式,在访问/路径的时候会重定向到/login路径
                    redirect: '/parent'
                }, {
                    path: '/parent',
                    component: parentComp,
                    // 涉及到了子路由的内容
                    children: [{
                            // 这就是用相对路径,相对于父组件的,这个实际路径就是/parent/login
                            path: 'login',
                            component: login
                        }, {
                            // 这就是用相对路径,相对于父组件的,这个实际路径就是/parent/login
                            path: 'registry',
                            component: registry
                        },
                    ]
                }]
            });
            var vm = new Vue({
                el: '#app',
                // 把路由挂在到实例上
                router: router
            })
        </script>
    </body>

    命名视图

  7. 我们之前只能一个地址对应一个组件,现在可以一个地址对应多个组件

  8. components属性设置的

  9. 给router-view设置名字,这个名字和components组件名字是对应的

  10. 设置默认值default对应组件可以设置名字也可以访问

  11. 3. 计算属性和监听器

    名称案例

  12. 获取完整的名字,需要把姓和名字拼接在一起

  13. 什么时候去拼接在一起(input值改变的时候)

  14. 监听keyup知道input什么时候改变了,在这里就可以获取完整的名字

3.4 method、computed和watch的区别

  1. computed属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用,使用的时候不加();

  2. methods方法表示一个具体的操作,主要书写业务逻辑;

  3. watch一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是computed和methods的结合体

猜你喜欢

转载自blog.csdn.net/m0_65849649/article/details/123748189