前端vue学习曲线(13)组件

本文详细介绍了在Vue中如何定义和使用组件,强调了data选项必须为函数这一关键点,并通过实例演示了prop如何用于父组件向子组件传递数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义组件

// 定义一个名为 button-counter 的新组件
	Vue.component("button-counter", {
		data() {
			return {
				count: 0
			}
		},
		template: '<button @click="count++">You clicked me {{ count }} times.</button>'
	})

2.使用

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

注意:

  • 一个组件的 data 选项必须是一个函数
  • 先定义组件,然后在创建vue对象

3.prop传数据

<blog-post title="props1"></blog-post>

Vue.component("blog-post", {
		props: ['title'],
		template: '<h3>{{title}}</h3>'
})

例子:

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

	</head>

	<body>
		<div id="app1">
			<button-counter></button-counter>
			<button-counter></button-counter>
			<button-counter></button-counter>
			<p>注意当点击按钮时,每个组件都会各自独立维护它的 count。因为你每用一次组件,就会有一个它的新实例被创建。</p>
			<h3>1.一个组件的 data 选项必须是一个函数</h3>

			<p>#prop传数据</p>
			<blog-post title="props1"></blog-post>
			<blog-post title="props2"></blog-post>

			<p>单个根元素</p>

			<blog-post1 
				v-for="post in posts" 
				v-bind:key="post.id" 
				v-bind:post="post">
			</blog-post1>
			
			
			<p>监听子组件事件</p>
			<div
				:style="{fontSize:postFontSize+'em'}">
				<blog-post2
					v-for="post in posts"
					:key="post.id"
					:post="post"
					@enlarge-text="postFontSize += $event"
				></blog-post2>
			</div>
		</div>
	</body>

</html>
<script>
	// 定义一个名为 button-counter 的新组件
	Vue.component("button-counter", {
		data() {
			return {
				count: 0
			}
		},
		template: '<button @click="count++">You clicked me {{ count }} times.</button>'
	})

	Vue.component("blog-post", {
		props: ['title'],
		template: '<h3>{{title}}</h3>'
	})

	Vue.component('blog-post1', {
		props: ['post'],
		template: `
    <div class="blog-post1">
      <h3>{{ post.title }}</h3>
      <div v-html="post.content"></div>
    </div>
  `
	})
	Vue.component("blog-post2",{
		props:['post'],
		template: `
    	<div class="blog-post2">
      	<h3>{{ post.title }}</h3>
      		<button @click="$emit('enlarge-text',0.1)">
        	Enlarge text
      		</button>
      	<div v-html="post.content"></div>
    </div>
  `
	})

	var app1 = new Vue({
		el: "#app1",
		data: {
			posts: [{
					id: 1,
					title: 'props1'
				},
				{
					id: 2,
					title: 'props2'
				}
			],
			postFontSize: 1
		}
	})
</script>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值