Vue专题-组件
阅读原文时间:2023年07月15日阅读:1

vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能。本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统。

Vue.js组件系统

每一个新技术的诞生,都是为了解决特定的问题。

组件的出现就是为了解决页面布局等等一些列的问题。

vue中的组件分为两种,全局组件和局部组件。

全局组件的注册

通过Vue.component()创建一个全局组件之后,我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28





Title






组件的参数

因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 datacomputedwatchmethods 以及生命周期钩子等。仅有的例外是像 el这样根实例特有的选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30





Title






组件的复用

每个实例维护自己的一份独立的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32





Title






注意当点击按钮时,每个组件都会各自独立维护它的 count。因为你每用一次组件,就会有一个它的新实例被创建。

Data必须是一个函数

data必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝, 也可以写成如下形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32





Title






局部组建的注册

全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

全局组件适中是存在的,除非程序结束,如果组件越来越大,那么程序所占用的空间和消耗的性能就会更大。

所以我们需要局部组件。不用的时候,被垃圾回收。

局部组件的第一种使用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37





Title






局部组件的第二种使用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36





Title






对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。

在局部组件中使用子组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64





Title






父子组件的通信

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66





Title






子父组件的通信

父组件在mounted的时候,监听一个自定义事件。

给子组件绑定一个click事件之后,通过内建的方法$emit在父组件上触发一个事件,这个时间就是父组件监听的自定义事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85





Title






混入

混入可以提高代码的重用性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89



Title

<script>  
    let mixs = {  
        methods: {  
            show: function (name) {  
                console.log(\`${name} is here!\`);  
            },  
            hide: function (name) {  
                console.log(\`${name} is gone!\`);  
            },  
        }  
    };

    // Vue.component("my-comp", {  
    //     template: \`  
    //               <div><button v-on:click="showAlex">点我显示alex</button></div>  
    //     \`,  
    //     methods: {  
    //         showAlex: function () {  
    //             alert("alex is here!");  
    //         },  
    //     }  
    // });  
    //  
    // new Vue({  
    //     el: "#mixin-demo",  
    // });

    let myAlex = {  
        template: \`  
                <div>  
                    <button @click="show('alex')">点我显示alex</button>  
                    <button @click="hide('alex')">点我隐藏alex</button>  
                </div>

        \`,  
        // methods: {  
        //     show: function (name) {  
        //         console.log(\`${name} is here!\`);  
        //     },  
        //     hide: function (name) {  
        //         console.log(\`${name} is gone!\`);  
        //     }  
        // }  
        mixins: \[mixs\],  
    };

    let myPeiqi = {  
        template: \`  
                <div>  
                    <button @mouseenter="show('peiqi')">鼠标移入显示沛齐</button>  
                    <button @mouseleave="hide('peiqi')">鼠标离开隐藏沛齐</button>  
                </div>  
        \`,  
        // methods: {  
        //     show: function (name) {  
        //         console.log(\`${name} is here!\`);  
        //     },  
        //     hide: function (name) {  
        //         console.log(\`${name} is gone!\`);  
        //     }  
        // },  
        mixins: \[mixs\],  
    };

    new Vue({  
        el: "#mixin-demo",  
        components: {  
            "my-alex": myAlex,  
            "my-peiqi": myPeiqi,  
        }  
    })  
</script>


插槽

有时候我们需要向组件传递一些数据,这时候可以使用插槽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45





Title