当前位置: 首页 > news >正文

11.vue3组件化开发(父子组件之间的通信)

1、组件的嵌套

利用脚手架创建一个项目。vue create 项目名

如果将所有逻辑都放在一个组件中,这个组件就会变得非常臃肿和难以维护。
组件化的核心思想是对组件进行拆分,再将这些拆分的组件嵌套在一起,最终形成应用程序。

2、组件的拆分

app:Header 、Main、Footer
Main: Banner、ProductList
各个部分还可以进行细化拆分。
拆分后开发对应的逻辑只需要去对应的组件编写就可。

<template>
<div id="app">
	<headert></headert>
	<Maint></Maint>
	<footert></footert>
</div>
</template>

<script>
	// 导入三个组件
	import Headert from "./Headert.vue";
	import Maint from "./Maint.vue";
	import Footert from "./Footert.vue";
	export default{
		data() {
			return{
				
			}
		},
		// 注册组件
		components : {
			Headert,
			Maint,
			Footert
		}
	}
</script>
<!-- scoped使得当前组件中的样式对于外部不产生影响 -->
<style scoped>
</style>

3.组件的CSS作用域

通过scoped防止组件与组件之间的样式污染。

<template>
	<h2>Vue</h2>
	<hello-world></hello-world>>
</template>

<script>
	import HelloWorld from "./HelloWorld.vue"
	export default {
		components : {
			HelloWorld
		}
	}
</script>

<style scoped>
	h2{
		color: pink;
	}
</style>

在这里插入图片描述

4.组件的通信

  • 比如App中可能用来多个Header,每个地方的Header展示的内容不同,那么我们就需要使用者传递个Header一些数据,让它进行展示;
  • 比如Main中一次性请求了Banner数据和ProductList数据,就需要传递给他们来进行展示。
  • 子组件中发生了事件,需要由父组件来完成某些操作,就需要子组件向父组件传递事件;

5.父子组件之间的通信方式

父组件传递给子组件
通props属性来完成组件之间的通信。

什么是props?

props是可以在组件上注册一些自定义的attribute;
父组件给这些attribute赋值,子组件通过attribute的名称获得对应的值。

props两种常见用法:

方式一:字符串数组,数组中的字符串就是attribute的名称。

//在子组件中先定义
export default{
		props :[ 'title','content']
		data(){
			return{
				
			}
		}
	}
<hello-world title="hhh" content="我是哈哈哈哈"></hello-world>

结果:
在这里插入图片描述

方式二:对象类型

export default{
		props:{
			title : String,
			content :{
				// 设置传入的类型
				type : String ,
				// 必传项
				required : true , 
				// 默认值为"abc",与require不能同时使用
				// default : 'abc'
			}
		},
	}

传入的类型type可以有哪些?
String、Number、Boolean、Array、Object、Date、Function、Symbol等

当type类型为Object的时候,值得是一个函数。

content :{
				type :Object,
				default(){
					return{
						name:'phoebe'
					}
				}
			}

非Prop的attribute
产地给某个组件一个属性,没有在Prop或者$emit中定义,称之为非Prop的attribute。
常见的包括class、id、style等

Attribute的继承
当组件有单个根节点时,非Prop的attribute将自动添加到根节点的Attribute中
在这里插入图片描述
禁用attribute继承
在组件中设置export default{ inheritAttrs :false}
将Attribute应用于根元素之外的其他元素<h2 :class="$attrs.class">Hello world</h2>
通过:class="$attrs.class来访问需要访问的非Props的attribute

子组件传递给父组件
通过$emit触发事件
计数器,输入数字计数器加这个数字,点击加减按钮计数器加减。

子组件:

<template>
	<button @click="subcreate">+1</button>
	<button @click="decreate">-1</button>
	<input type="text" v-model.number="num">
	<button @click="subcreateN">+N</button>
</template>

<script>
	export default{
		emits:["add" ,"sub","addN"],
		data(){
			return {
				num:0
			}
		},
		methods:{
			subcreate(){
				console.log("+1")
				this.$emit("add")
			},
			decreate(){
				console.log("-1")
				this.$emit("sub")
			},
			subcreateN(){
				this.$emit("addN",this.num)
			}
		}
	}
</script>

父组件:

<template>
	<h2>当前数值{{counter}}</h2>
	<counter @add="addOne" @sub="subOne" @addN="addN"></counter>
</template>

<script>
	import Counter from "./Counter.vue"
	export default {
		
		components : {
			Counter
		},
		data(){
			return {
				counter :0
			}
		},
		methods:{
			addOne(){
				this.counter++
			},
			subOne(){
				this.counter--
			},
			addN(num){
				this.counter+= num
			}
		}
	}
</script>

注册emits也可以写成对象形式,为了验证参数。

6、商品栏切换案例

在这里插入图片描述

<template>
	<div >
		<tabchange :titles="titles" @titlechange="titlechange"></tabchange>
		<h2>{{contents[currentIndex]}}</h2>
	</div>
</template>

<script>
	import Tabchange from "./Tabchange.vue"
	export default {
		
		components : {
			Tabchange
		},
		data(){
			return {
				titles:["衣服","裤子","鞋子"],
				contents :["衣服页面","裤子页面","鞋子页面"],
				currentIndex :0
			}
		},
		methods:{
			titlechange(index){
				this.currentIndex =index;
			}
		}
	}
</script>

<style scoped>
	
</style>
<template>
	<div class="tab-control">
		<div class="tab-title" 
			:class="{active:currentIndex===index}" 
			v-for="(title ,index) in titles" 
			:key="title" 
			@click="change(index)">
			<span >
				{{title}}
			</span>
		</div>
	</div>
</template>

<script>
	export default{
		emits :["titlechange"],
		props :{
			titles:Array,
			default(){
				return []
			}
		},
		data(){
			return{
				currentIndex:0
			}
		},
		methods:{
			change(index){
				this.currentIndex =index,
				this.$emit("titlechange",index)
			}
		}
	}
</script>

<style scoped>
	.tab-control{
		display: flex;
	}
	.tab-title{
		flex: 1;
		text-align: center;
	}
	 .active{
		color: red;
		/* border-bottom: 3px solid red;
		padding: 5px 8px; */
	}
	.active span{
		 border-bottom: 3px solid red;
		 padding: 5px 8px; 
	}
</style>

相关文章:

  • 戳这里!有机产品认证知识库来了
  • 基于微信小程序和安卓的农产品线上销售购物商城APP
  • QScored大型代码异味和质量度量-数据集
  • 爱摸鱼的TT~自学Java从入门到入土学习手册
  • 中断上下文使用spin_lock进程上下文使用spin_lock_irqsave的原因?
  • 【AGC】【FAQ】Dynamic Ability常见问题
  • 集成应用签名服务,加入签名计划后,想要删除AGC中托管的应用签名,退出签名计划如何做?应用签名服务常见问题小集合
  • docker 查看容器启动日志 查看运行日志
  • 【web-攻击本地编译性应用程序】(11.1)缓冲区溢出漏洞
  • docker 打包镜像
  • github配置ssh密钥
  • 3.2 创建会员中心微服务模块 -service provider
  • 物联网开发笔记(1)- 使用Wokwi仿真树莓派Pico点亮LED灯
  • 内网渗透-frp 用于内网穿透的基本配置和使用
  • linux快速杀进程
  • [deviceone开发]-do_Webview的基本示例
  • 【Linux系统编程】快速查找errno错误码信息
  • 2017 前端面试准备 - 收藏集 - 掘金
  • codis proxy处理流程
  • create-react-app做的留言板
  • C学习-枚举(九)
  • HTML中设置input等文本框为不可操作
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • OSS Web直传 (文件图片)
  • TypeScript迭代器
  • 搞机器学习要哪些技能
  • 解析 Webpack中import、require、按需加载的执行过程
  • 警报:线上事故之CountDownLatch的威力
  • 前端攻城师
  • 深入浏览器事件循环的本质
  • 我有几个粽子,和一个故事
  • 新手搭建网站的主要流程
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 再谈express与koa的对比
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 智能网联汽车信息安全
  • #mysql 8.0 踩坑日记
  • #window11设置系统变量#
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (03)光刻——半导体电路的绘制
  • (1)无线电失控保护(二)
  • (7)STL算法之交换赋值
  • (a /b)*c的值
  • (C语言)逆序输出字符串
  • (Python) SOAP Web Service (HTTP POST)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (转)Mysql的优化设置
  • (转)母版页和相对路径
  • (转载)OpenStack Hacker养成指南
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)