Vue组件开发

组件化开发思想

标准、分治、重用、组合

组件化规范 Web Components(标准化组织制定的规范)

我们希望尽可能多的重用代码
自定义组件的方式不太容易
多次使用组件可能导致冲突
Vue部分实现了上述规范

组件注册

在这里插入图片描述

组件用法

在这里插入图片描述

<div id="app">
	<button-counter></button-counter>
	</div>
	<script src="js/vue.js"></script>
	<script>
		Vue.component('button-counter',{
			data: function () {
				return {
					count: 0
				}
			},
			template: '<button @click="count++">点击了{{count}}次</button>'
		})
		var vm = new Vue({
			el: '#app',
			data: {

			}
		})
	</script>

组件注册注意事项

  1. data必须是一个函数
    //这里data是要是函数
    data: function () {
    return {
    count: 0
    }
  2. 组件模板内容必须是单个跟元素
    template: ‘<button @click=“handle”>点击了{{count}}次’,
  3. 组件模板内容可以是模板字符串
    在这里插入图片描述
  4. 组件命名方式
    在这里插入图片描述
    如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的使用组件。但是在普通的标签模板总,必须使用短横线的方式使用组件。

在这里插入图片描述
在这里插入图片描述

局部组件注册

在这里插入图片描述

组件间的数据交互

父组件向子组件传值
在这里插入图片描述

<div id="app">
		<div>{{pmsg}}</div>
		<!-- //子组件 父组件的内容通过属性绑定的方式传递给子组件 -->
		<menu-item title='来自父组件的值'></menu-item>
		<menu-item :title='ptitle'></menu-item>
	</div>
	<script src="js/vue.js"></script>
	<script>
		Vue.component('menu-item', {
			props: ['title'],
			data: function () {
				return {
					msg: '子组件本身的数据'
				}
			},
			template: '<div>{{msg+ "---" + title}}</div>'
		});
		var vm = new Vue({
			el: '#app',
			data: {
				pmsg: '父组件中的内容',
				ptitle: '动态绑定属性'
			}
		});
	</script>

在这里插入图片描述
在这里插入图片描述
props属性值类型
D
子组件向父组件传值
props传递数据原则:单向数据流,只能用于父组件向子组件传递
在这里插入图片描述
首先子组件触发一个自定义事件,同时父组件监听这个自定义事件,当子组件触发时会把事件抛出给父组件,父组件会执行相应的动作。
在这里插入图片描述
子组件向父组件传值的案例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="app">
		<div :style='{fontSize: fontSize + "px"}'>{{pmsg}}</div>
		<!-- //属于父组件的模板 -->
		<!-- 接收子组件中的数值用$event -->
		<menu-item :parr='parr' 
	@enlarge-text='handle($event)'></menu-item>
	</div>
	<script src="js/vue.js"></script>
	<script>
		// 子组件
		Vue.component('menu-item', {
			props: ['parr'],
			template: `
				<div>
					<ul>
						<li :key='index' v-for='(item, index) in parr'>{{item}}</li>
						<button @click='parr.push("lemon")'>点击</button>
					</ul>
					<button @click='$emit("enlarge-text", 5)'>字体大小</button>
				</div>
			`
		});
		// 父组件
		var vm = new Vue({
			el: '#app',
			data: {
				pmsg: '父组件中内容',
				parr: ['apple', 'orange', 'banana'],
				fontSize: 10
			},
			methods: {
				handle: function (val) {
					//扩大字体大小
					this.fontSize += val; 
				}
			}
		})
	</script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值