Skip to content

12 初识Vue组件

在vue中,组件是最重要的组合部分,官方中定义组件为可复用的vue实例,分为全局组件和局部组件,接下来通过实例来分别演示两种不同的组件。

12.1.全局组件

全局组件可以在任意Vue示例下使用。

html
<div id="app">
    <mycomponent></mycomponent>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    Vue.component('mycomponent', {
        template: '<h3>我是全局组件</h3>'
    });

    var vm = new Vue({
        el: '#app',
    });
</script>

通过上面的例子,我们可以总结出全局组件的使用步骤:

  1. 使用vue.component()注册组件,需要提供2个参数:组件的标签名和组件构造器。
  2. vue.component()内部会调用组件构造器,创建一个组件实例
  3. 将组建挂载到某个vue实例下。

注意:一个组件的template部分,必须要包裹在一个根容器中。

因为组件是可复用的vue实例,所以它们也能有data、computed、watch、methods以及生命周期钩子等。

html
<div id="app">
    <mycomponent></mycomponent>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    Vue.component('mycomponent', {
        template: `<div>
                        <h3>我是全局组件</h3>
                         <button @click="add">加</button>
                   </div>`,
        data(){
            return {
                num:1
            }
        },
        methods:{
            add(){
                this.num++;
            }
        }
    });

    var vm = new Vue({
        el: '#app',
    });
</script>

上面代码中有两个注意事项:

  1. 组件模板的内容,可以写在一对反引号中(``),这样就可以不使用字符串拼接的形式了。
  2. 一个组件的data选项必须是一个函数,该函数返回一个对象。

12.2.局部组件

如果不需要全局注册,或者是让组件使用在其它组件内,可以用选项对象的components属性实现局部注册。 因此我们可以将上面的全局组件改为局部组件。

html
<div id="app">
    <mycomponent></mycomponent>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let obj = {
        template: `<div>
                       <h3>我是局部组件</h3>
                        <button @click="add">加</button>
                   </div>`,
        data(){
            return {
                num:1
            }
        },
        methods:{
            add(){
                this.num++;
            }
        }
    };

    var vm = new Vue({
        el: '#app',
        components:{    //声明局部组件
            mycomponent:obj
        }
    });
</script>

12.3.组件模板

如果组件中的template内容过多,那么可以使用组件模板来声明template中的内容。

html
<div id="app">
    <mycomponent></mycomponent>
</div>

<!-- 组件模板 -->
<template id="mytemplate">
    <div>
        <h3>我是局部组件</h3>
         <button @click="add">加</button>
    </div>
</template>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let obj = {
        template: '#mytemplate',      //使用选择器应用组件模板
        data() {
            return {
                num: 1
            }
        },
        methods: {
            add() {
                this.num++;
            }
        }
    };

    var vm = new Vue({
        el: '#app',
        components: { //声明局部组件
            mycomponent: obj //组件名:组件实例
        }
    });
</script>

12.4 完整代码

  • 全局组件
html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> -->
		<script src="./js/vue.js"></script>


	</head>
	<body>
		<div id="app">
			<mycomponent></mycomponent>
			<mycomponent></mycomponent>
			<mycomponent></mycomponent>
			<mycomponent></mycomponent>
		</div>


		<script>
			Vue.component('mycomponent', {
				template: `<div>  <h3>我是全局组件</h3>  </div>`,
				data() {
					return {}
				},
				methods: {
					add() {
						this.num++;
					}
				}
			});

			var vm = new Vue({
				el: '#app',
				
			});
		</script>

	</body>
</html>
  • 局部组件
html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> -->
		<script src="./js/vue.js"></script>


	</head>
	<body>
		<div id="app">
			<localcomponent></localcomponent>
			<localcomponent></localcomponent>
			<localcomponent></localcomponent>
		</div>

		<template id="btncounter">
			<div>
				局部组件 {{num}}
				<button @click='counter'>数量++</button>
			</div>
		</template>


		<script>
			
			var vm = new Vue({
				el: '#app',
				components:{
					localcomponent:{
						// template:`
						// <div>
						// 	局部组件 {{num}}
						// 	<button @click='counter'>数量++</button>
						
						// </div>`,
						template:'#btncounter',
						data(){
							return {
								num:1
							}
						},
						methods:{
							counter(){
								this.num++;
							}
						}
					}
				}
			});
		</script>

	</body>
</html>

Released under the MIT License.