组件

作者: 骏龙ll | 来源:发表于2019-07-30 14:55 被阅读0次

    什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可;

    组件化和模块化的不同:
    模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一;
    组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用;

    全局组件定义的三种方式

    这里讲一种
    全局组件

    <!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>
    </head>
    <body>
        
        <div id="app">
            <login></login>
        </div>
    
        <script src="./js/vue.js"></script>
        <script>
            Vue.component('login',{
                template : `<h1>{{msg}}</h1>`,
                data() {
                    return {
                        msg: '登录'
                    }
                },
            })
    
            const vm = new Vue({
                el : '#app',
                data : {
    
                }
            })
        </script>
    </body>
    </html>
    

    局部组件

    <!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>Document</title>
    </head>
    
    <body>
        <div id="app">
            <account></account>
        </div>
    
        <script src="./js/vue.js"></script>
        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {},
                methods: {},
                components: { // 定义子组件
                    account: { // account 组件
                        template: '<div><h1>这是Account组件{{name}}</h1><login></login></div>', // 在这里使用定义的子组件
                        data() {
                            return {
                                name: '张三'
                            }
                        },
                        components: { // 定义子组件的子组件
                            login: { // login 组件
                                template: "<h3>这是登录组件</h3>"
                            }
                        }
                    }
                }
            });
        </script>
    </body>
    
    </html>
    

    组件切换

    <!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>Document</title>
    </head>
    
    <body>
        <div id="app">
            <input type="button" value="toggle" @click="flag=!flag">
            <my-com1 v-if="flag"></my-com1>
            <my-com2 v-else></my-com2>
        </div>
    
        <script src="./js/vue.js"></script>
        <script>
            Vue.component('myCom1', {
                template: '<h3>奔波霸</h3>'
            })
    
            Vue.component('myCom2', {
                template: '<h3>霸波奔</h3>'
            })
    
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    flag: true
                },
                methods: {}
            });
        </script>
    </body>
    
    </html>
    

    父组件向子组件传值

    <!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>Document</title>
    </head>
    
    <body>
        <div id="app">
            <son :finfo="msg"></son>
        </div>
    
        <script src="./js/vue.js"></script>
        <script>
            const vm = new Vue({
                el: '#app',
                data: {
                    msg: '这是父组件的值'
                },
                components: {
                    son: {
                        template: '<h1>这是子组件 --- {{finfo}}</h1>',
                        props: ['finfo']
                    }
                }
            })
        </script>
    </body>
    
    </html>
    

    子组件向父组件传值

    <!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>Document</title>
    </head>
    
    <body>
        <div id="app">
            <son @func="getMsg"></son>
        </div>  
        <script src="./js/vue.js"></script>
        <script>
            Vue.component('son',{
                template : `<button @click="sendMsg">子组件按钮</button>`,
                data() {
                    return {
                        sonmsg: '子组件传过来的值'
                    }
                },
                methods: {
                    sendMsg(){
                        this.$emit('func',this.sonmsg)
                    }
                },
            })
    
            const vm = new Vue({
                el : '#app',
                data : {},
                methods : {
                    getMsg(val){
                        alert(val);
                    }
                }
            })
        </script>
    </body>
    
    </html>
    

    ref获取元素

    <!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>
    </head>
    
    <body>
        <div id="app">
            <div>
                <input type="button" value="获取元素内容" @click="getElement" />
                <!-- 使用 ref 获取元素 -->
                <h1 ref="myh1">这是一个<span>大</span>大的H1</h1>
                <hr>
                <!-- 使用 ref 获取子组件 -->
                <my-com ref="mycom"></my-com>
            </div>
        </div>
        <script src="./js/vue.js"></script>
        <script>
            Vue.component('my-com',{
                template: '<h5>这是一个子组件</h5>',
                data() {
                    return {
                        name: '子组件'
                    }
                }
            });
    
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {},
                methods: {
                    getElement() {
                        // 通过 this.$refs 来获取元素
                        console.log(this.$refs.myh1.innerText);
                        // 通过 this.$refs 来获取组件
                        console.log(this.$refs.mycom.name);
                    }
                }
            });
        </script>
    </body>
    
    </html>
    

    相关文章

      网友评论

          本文标题:组件

          本文链接:https://www.haomeiwen.com/subject/nrhnrctx.html