组件

2019-07-30  本文已影响0人  骏龙ll

什么是组件: 组件的出现,就是为了拆分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>
上一篇下一篇

猜你喜欢

热点阅读