vue-学习笔记-基础3

1、组件

组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js的编译器为它添加特殊功能。在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展

也就是说,一个app中,有很多地方的html结构大体上是一样的,只是展示的数据不一样,这种情况就可以将一致的结构定义成一个组件。有时候,一些自定义的元素如果是放在table,select等有特定规定的元素下(对子元素的标签有要求),则可以采用is特性,将自定义的标签“伪装成”特定的子元素,这样就会正常的被包裹,要不然不是这些(table,select等)元素的子元素。

并且,如果一个组件中包含多个并列的元素,需要用一个元素来包裹,要不然不会渲染;全局注册的组件,需要在创建实例之前就注册好。

<div id='box'>
	<table>
		<tr is="my-component"></tr>
	</table>	
</div>
Vue.component('my-component',{//全局注册 template:'<div>这是测试数据<p>testing</p></div>' }) var vm = new Vue({ el:"#box",    data:{} });

 1.1 全局注册 && 局部注册

全局注册的组件需要放在Vue实例化之前,局部注册的组件只能在当前实例内部使用

<body>
<div id='box'>
	<my-component></my-component>	
	<other-component></other-component>
</div>
<p>********分割线***********</p>
<div id='box2'>
	<my-component></my-component>
	<other-component></other-component>
</div>
<style type="text/css">
	*{padding: 0;margin: 0}	
</style>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
Vue.component('my-component',{//全局注册
	template:'<div>这是测试数据<p>testing</p></div>'
})
var otherTem = {
	template:'<div>a custom component</div>'
}
var vm = new Vue({
	el:"#box",
  	data:{},
	components:{
		'other-component':otherTem
	}
})
new Vue({
	el:"#box2",
	data:{}
})

</script>
</body>

  向上述代码中,other-component在box2中无法渲染,因为它的作用域在box中,而my-compoent是全局注册的,每个实例都可以使用

 通过vue构造器传入的各种选项大多数都可以在组件里使用,但是,data必须是一个函数。因为既然是一个组件,肯定不会只用一次,既然要用多次,他们的数据就要独立,互不影响才对。并且,要求data返回的必须是一个对象,要不然会报错

这个可以用下面这种方式模拟

<body>
<div id='box'>
<my-component></my-component>
<my-component></my-component>
<my-component></my-component>
</div>
<style type="text/css">
	*{padding: 0;margin: 0}	
	button{padding:5px;}
</style>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
var data = {counter:0};
Vue.component('my-component',{
	template:'<button @click="counter++">{{counter}}</button>',
	data:function(){
		return data
	}
})
new Vue({
	el:'#box'
})
</script>
</body>

  三个按钮,显示的值会一样,因为他们共用同一个全局变量counter

 

原文地址:https://www.cnblogs.com/tiantianxiangshang33/p/6902556.html