vue基础篇之组件2

尚硅谷Vue2.0 全套教程 Part2丨vuejs从入门到精通笔记 | Vue_Test 阅读详情

上篇介绍了组件的注册、模板和嵌套组件的写法,这篇主要介绍组件之间的传值和操作,包括父子组件传值、平行组件传值、父组件操作子组件,子组件操作父组件。

  • 父组件传值给子组件

 父组件->子组件       通过在子组件标签上绑定自定义属性名,父组件数据为属性值。

                                  子组件内部通过props属性  数组形势  接收属性名  模版内部通过解析属性名加载数据。

<!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="out">		
		<h2>父组件传值子组件</h2>		
		<v-parent></v-parent>
	</div>	
	<template id="parent">
		<div>
			<h1>父组件</h1>
			<p>{{str}}</p>
			<button @click="tap()">发送给子组件</button>
			<hr />			
			<v-child :name="str1"></v-child>			
		</div>
	</template>	
	<template id="child">
		<div>
			<h2>子组件</h2>
			<p>{{str}}</p>
			<h3>接收父组件传递的数据--{{name}}</h3>
			<button @click="tap()">子组件事件</button>
		</div>
	</template>	
</body>
<script type="text/javascript">
	var vm=new Vue({
		el:'#out',
		data:{	
		},
		methods:{
		},
		components:{
			'v-parent':{
				template:'#parent',
				data:function(){
					return{
						str:'这是父组件的数据',
						str1:''
					}
				},
				methods:{
					tap(){
                                                //:name="str1"   父组件传值
						this.str1=this.str
					}
				},
				components:{
					'v-child':{
                                                //:name="str1"  子组件接收
						props:['name'],
						template:'#child',
						data:function(){
							return{
								str:'this is child infos'
							}
						},
						methods:{
							tap(){
								console.log(this.str)
							}
						}
					}
				}
			}
		}
	})
	
</script>
</html>
  • 子组件传值父组件

      子组件-父组件         通过在子组件标签上绑定自定义事件名,事件调用的函数(不能加())声明
                                        在父组件内部,函数参数为接收的数据值,子组件内部通过$emit进行推送

<!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="out">
		<h2>子组件传值父组件</h2>		
		<v-parent></v-parent>
	</div>	
	<template id="parent">
		<div>
			<h1>父组件</h1>
			<h3>接收子组件的数据--{{str}}</h3>	
			<hr />		
			<v-child @toparent="getdata"></v-child>			
		</div>
	</template>
	<template id="child">
		<div>
			<h2>子组件</h2>
			<p>{{str}}</p>
			<button @click="tap()">发送给父组件</button>			
		</div>
	</template>
</body>
<script type="text/javascript">
	var vm=new Vue({
		el:'#out',
		data:{			
		},
		methods:{
		},
		components:{
			'v-parent':{
				template:'#parent',
				data:function(){
					return{
						str:''
					}
				},
				methods:{
                                        //@toparent="getdata"    父组件接收值
					getdata(msg){
						this.str=msg
					}
				},
				components:{
					'v-child':{
						template:'#child',
						data:function(){
							return{
								str:'this is child infos'
							}
						},
						methods:{
							tap(){
                                                               //@toparent="getdata"    子组件传值
								this.$emit('toparent',this.str)	
							}
						}
					}
				}
			}
		}
	})

</script>
</html>
  • 父子传值(父到子,子到父)
<!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="out">
			<h1>{{str}}</h1>
			
			<v-parent></v-parent>
		</div>
		
		<template id="parent">
			<div>
				<h2>{{tit}}</h2>
				<p>这是父组件的数据-----{{str}}</p>
				<p>我要接受子组件的传值------{{str2}}</p>
				
				<button @click="tap()">发送给子组件</button>
				<hr />
				
				<v-child  :name="str1" @toparent="getdata"></v-child>
			</div>
		</template>
		
		<template id="child">
			<div>
				<h2>{{tit}}</h2>
				<p>这是子组件的数据-----{{str}}</p>
				<p>我要接受父组件的传值------{{name}}</p>
				
				<button @click="tap()">发送给父组件</button>
			</div>
		</template>		
	</body>
	<script type="text/javascript">
		var vm = new Vue({
			el:"#out",
			data:{
				str:"组件嵌套"
			},
			methods:{
				
			},
			components:{
				"v-parent":{
					template:"#parent",
					data:function(){
						return{
							tit:"父组件",
							str:"哈哈哈哈,我是父组件",
							str1:"",
							str2:""
						}
					},
					methods:{
						tap(){
							this.str1=this.str
						},
						getdata(msg){
                           this.str2 = msg
						}
					},
					components:{
						"v-child":{
							props:["name"],
							template:"#child",
							data:function(){
								return{	
									tit:"子组件",
									str:"啦啦啦啦,我是子组件",	
								}
							},
							methods:{
								tap(){
									this.$emit("toparent",this.str)
								}
							}
						}
					}
				}
			}
		})
	</script>
	<!--父到子---属性;子到父---事件;平行---新的vue对象-->
</html>
  • 平行组件之间传值

       平行组件-- 核心    空vue对象    调用 $emit 推送     $on 接收

<!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="out">
			<h1>平行组件传值</h1>
			<hr />
			<v-a></v-a>
			<hr />
			<v-b></v-b>
			<hr />
			<v-c></v-c>
		</div>
		
		<template id="aa">
			<div>
				<h2>{{str}}</h2>
				<p>这是a组件的数据------{{str1}}</p>
				<button @click="tap()">发送给c组件</button>
			</div>
		</template>
		
		<template id="bb">
			<div>
				<h2>{{str}}</h2>
				<p>这是b组件的数据-----{{str1}}</p>
				<button @click="tap()">发送给c组件</button>
			</div>
		</template>
		
		<template id="cc">
			<div>
				<h2>{{str}}</h2>
				<p>接收A组件的传值-----{{stra}}</p>
				<p>接收B组件的传值-----{{strb}}</p>
			</div>
		</template>
		
	</body>
	<script type="text/javascript">
		var vm1 = new Vue({})
		
		var vm = new Vue({
			el:"#out",
			data:{
				
			},
			methods:{
				
			},
			components:{
				"v-a":{
					template:"#aa",
					data:function(){
						return{
							str:"a组件",
							str1:"aaaaaa"
						}
					},
					methods:{
						tap(){
//							console.log(this.str1)
							vm1.$emit("isa",this.str1)
						}
					}
				},
				"v-b":{
					template:"#bb",
					data:function(){
						return{
							str:"b组件",
							str1:"bbbbb"
						}
					},
					methods:{
						tap(){
//							console.log(this.str1)
							vm1.$emit("isb",this.str1)
						}
					}
				},
				"v-c":{
					template:"#cc",
					data:function(){
						return{
							str:"c组件",
							stra:"",
							strb:""
						}
					},
					mounted(){
						var _this = this
						vm1.$on("isa",function(msg){
							_this.stra = msg
						})
						
						vm1.$on("isb",function(msg){
							_this.strb = msg
						})
					}
				}
			}
		})
	</script>	
</html>
  • 组件间的操作

      父组件操作子组件---$refs   this.$refs.name.str         $parent----子组件操作父组件数据  this.$parent.str

<!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="out">
			<h1 ref="s1">{{tit}}</h1>
			<button @click="tap()">操作dom</button>
			<hr />
			<v-parent></v-parent>
		</div>
		
		<template id="parent">
			<div>
				<h2>父组件</h2>
				<button @click="tap()">操作子组件</button>
				<hr />
				<v-child ref="childs"></v-child>
			</div>
		</template>
		
		<template id="child">
			<div>
				<h2>子组件</h2>
				<button @click="tap()">操作父组件</button>
			</div>
		</template>
		
	</body>
	<script type="text/javascript">
		var vm = new Vue({
			el:"#out",
			data:{
				tit:"组件操作"
			},
			methods:{
				tap(){
					console.log(this.$refs.s1.innerHTML)
				}
			},
			components:{
				"v-parent":{
					template:"#parent",
					data:function(){
						return{
							str:"父组件数据"
						}
					},
					methods:{
						tap(){
							console.log(this.$refs.childs.str)  //子组件数据
						}
					},
					components:{
						"v-child":{
							template:"#child",
							data:function(){
								return{
									str:"子组件数据"
								}
							},
							methods:{
								tap(){
									console.log(this.$parent.str)
								}
							}
						}
					}
				}
			}
		})
	</script>
</html>

注: 在mounted函数中,使用$refs获取dom 时候,dom树有时候未更新,这就需要用到$ nextTick 

 /*nextTick里面的代码会在DOM更新后执行*/---mounted函数中执行

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>最新dom</title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="out">
			<h1>最新dom</h1>
			<p ref="tit">{{str}}</p>
		</div>
	</body>
	<script type="text/javascript">
		var vm = new Vue({
			el:"#out",
			data:{
				str:"hello  world"
			},
			mounted(){
				this.str="你好 世界"
				
//				console.log(this.$refs.tit.innerHTML) //hello world
				
				this.$nextTick(function(){
					console.log(this.$refs.tit.innerHTML)
				})
			}
		})
	</script>
</html>
  • solt分发(插槽)

      使用slot发布内容

      Slot标签添加 属性 <slot name="ul-slot">

      内容可通过  slot属性值查找是否显示默认<ul slot="ul-slot">

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>slot分发(插槽)</title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="out">
			<h2>slot插槽</h2>
			
			<v-header>
				<ol slot="oll">
					<li>1</li>
					<li>2</li>
					<li>3</li>
				</ol>
				
				<!--不用slot,相当于组件标签内没有内容,显示slot注册的内容-->
				<!--<ul>
					<li>111</li>
				</ul>-->
				
				<!--有内容显示内容-->
				<ul slot="hi">
					<li>222</li>
				</ul>
			</v-header>
		</div>
		
		<template id="header">
			<div>
				<h3>组件---</h3>
				
				<slot name="oll">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate consectetur accusantium incidunt ex modi itaque alias magni quo aperiam dolorum hic dolor facere optio vero porro explicabo facilis error! Esse.</slot>
				
				<slot name="hi">哈哈哈</slot>
			</div>
		</template>
		
		
	</body>
	<script type="text/javascript">
		var vm = new Vue({
			el:"#out",
			data:{
				
			},
			components:{
				"v-header":{
					template:"#header"
				}
			}
		})
	</script>
</html>

solt用于在组件标签内写入内容显示出来,没有内容的时候展示solt里面的内容。

<!--父到子组件---属性;子到父组件---事件;平行组件---新的vue对象-->

【零基础入门VUE】VueJS - 概述 不会对 DOM 进行更改,而是创建 DOM 的副本,该副本以 JavaScript 数据结构的形式存在。最终的更改会更新到真实的 DOM,用户将看到它的变化。随后,对两个 JavaScript 对象进行比较,并在真实 DOM 中更新最终的更改。Ember 添加了 glimmer 渲染引擎,旨在提高重新渲染性能,这与使用虚拟 DOM 的 VueJS 和 React 是类似的概念。随着时间的推移,淘汰赛的发展速度已经放缓。VueJS 继承了 Angular 和 React 的优点,并构建了一个强大的库。 阅读详情

相关推荐

从零开始搭建自己的VueJS2.0+ElementUI单页面网站(三、组件编写及通信)

前言本文是本系列的第三篇文章。在前两篇文章中我们介绍了关于搭建vue+elementUI开发环境的方法和编写导航页的方法。关于前两篇文章的内容,若读者有些记不清楚,可以点击下方链接快速查看: 从零开始搭建自己的VueJS2.0+ElementUI单页面网站(一、环境搭建) 从零开始搭建自己的VueJS2.0+ElementUI单页面网站(二、编写导航页)

天降风云的博客 1万+

vue3.0笔记(二)

关于setup一些细节问题及组件之间的传值 这里创建一个父组件 <template> <h2>App父级组件</h2> <h3>msg:{{ msg }}</h3> <button @click="msg += '==='">更新数据</button> <hr /> <Child :msg="msg" msg2="真香" @xxx="xxx" /> </template&gt

杨振洲的博客 307

【vuejs】vue2项目中封装组件的分析以及常用方式和属性讲解

定义组件模板是封装过程的第一步。在Vue2中,模板是组件的声明式部分,它描述了组件的UI结构。模板可以包含HTML标签、组件自定义标签以及Vue指令。基本结构:每个组件模板都应遵循基本的HTML结构,包括标签包裹的组件内容。组件复用:在模板中使用标签来复用已有的Vue组件或HTML元素。动态组件:利用可以实现组件的动态切换。条件渲染:使用v-ifv-else-ifv-else和v-show实现条件渲染,使组件能够根据不同条件显示不同内容。列表渲染:使用v-for。

工作的日常记录和平凡的生活分享 2111

【Vue 开发实战】基础篇 # 2:组件基础及组件注册

button v-show="del">删除通常把可拆分的html,以及拆分后的逻辑,样式组合在一起称之为组件。// 定义一个名为 todo-item 的组件;// data 需要为函数返回一个对象,保证唯一性。// 定义一个名为 todo-list 的组件。【Vue 开发实战】学习笔记。

学习前端这门手艺,栈底到栈顶依次是:浏览器架构、Web 网络、事件循环机制、JavaScript 核心、V8 的内存管理、浏览器的渲染流程、Web 安全、CSS、React、Vue、Node、构建工具链等 292

深入理解HTTPS:从SSLHandshakeException到证书链验证的完整解析

本文深入解析了HTTPS握手过程中常见的SSLHandshakeException异常,特别是由证书链验证失败引发的CertPathValidatorException。文章从TLS握手流程、证书链验证的数学原理出发,详细剖析了Java中TrustManager的工作机制,并提供了针对证书链不完整、自签名证书等典型问题的系统化排查流程与实战解决方案。

weixin_29313423的博客 232

用树莓派Pico低成本更新USB-C PD控制器固件实战指南

固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现

weixin_27869497的博客 461

VUE2中文文档:组件基础篇

组件基础 组件(component),是具有 name 名称的可复用 Vue 实例:当前示例中是<button-counter>。我们可以使用new Vue创建出一个 Vue 根实例,然后将这个组件作为其中的一个自定义元素(custom element)。 由于组件是可复用的 Vue 实例,它们接收的选项,和在new Vue时候的选项相同,例如data,co...

weixin_30559481的博客 185

详解卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

qq_25762497的博客 25万+

Vue2基础篇-21-非单文件组件

vue组件分为单文件和非单文件

Alan0517 412

仿人型机械臂逆运动学避坑指南:当末端三关节平行时如何处理奇异点

本文深入探讨了6R仿人型机械臂在末三轴平行结构下的逆运动学求解策略,重点分析了运动学逆解中的奇异点问题及其处理方法。通过MATLAB实现展示了D-H参数建模、几何解析法求解流程以及奇异点规避策略,为工业机器人开发提供了实用的数值算法方案和工程优化技巧。

sss66的博客 883

【乐企文件生成工程】添加数据库、SpringEvent事件支持

更新!1、乐企版式文件生成工程添加数据库支持2、乐企版式文件生成工程添加事件机制,异步处理文件生成,提高系统并发能力。

九七的博客 337

面试篇字节跳动审核,Vue3 的 7 种和 Vue2 的 12 种组件通信(1),web前端开发基础入门

前端字节跳动真题解析一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

m0_57541068的博客 781

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2171

一、Vue2笔记--基础篇--19-非单文件组件

Vue中使用组件的三大步骤: 一、定义组件(创建组件) 二、注册组件 【注册在 Vue实例 的一个属性 component 上】 三、使用组件(写组件标签) 组件名的注意事项 关于VueComponent和Vue的关系

weixin_49931650的博客 408

【异常】Antigravity IDE 登录异常与网络连接错误排查指南

在使用 Google 推出的 AI 原生 IDE时,部分用户可能会遇到身份验证失效与网络环境冲突导致的叠加错误。本文将针对此类典型故障提供完整的解决思路。

奶爸的编程之路,也就一周冷个三天 1725

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

vue2.0常用内容总结篇

vue常用知识点总结

qq_26337713的博客 2019

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

vue2.0学习笔记(六):深刻理解Vue中的组件(1)--基础篇

深刻理解Vue中的组件(1)--基础篇github链接 (demo04持续更新中) 什么是组件?组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码在vue-cli中简单的理解。vue组件就是一个 .vue 文件,里面包含<template> <script&...

weixin_34279246的博客 155

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Vue2基础——vue-cli,组件

在工程化的项目中,vue要做的事情很单纯:通过main.js把 App.vue渲染到index.html的指定区域中.App.vue用来编写待渲染的模板结构index.html中需要预留一个el区域main.js 把 App.vue渲染到了index.html所预留的区域中

shhghvvh的博客 645

Vue2.5 入门基础教程

1.前言 本篇文章是曾任去哪网的高级前端工程师DellLee在慕课网发布的教学课程《Vue2.5入门》而总结的笔记。原视频地址:https://www.imooc.com/learn/980 本笔记适用于新手学习vue框架进行前端的开发。 2.基础语法 2.1 模板挂载点实例之间的关系 &amp;lt;!-- div是挂载点 el属性后面对应的标签--&amp;gt; &amp;lt;div id=&quot;root&quot;&amp;gt; ...

Panda_Program的博客 894

Vue2.x文档细读(基础篇)

一本好书就是一个好老师 Vue官方提供的文档非常详细,我觉得有必要啃一啃,写一些自己的心得,减少遇坑,Vue文档里把很多坑都列出来了,写这篇是温习一下我看的基础篇,如果错误,请指正 Vue官方文档 Vue的特性: 核心特性 不用触碰DOM,所有操作DOM的都由VUE完成,我们只关注逻辑层即可(例:在methods中修改data) 一个组件其实就是一个VUE实例,一个组件本质上是一个拥有预定义选项...

yuan5801551的博客 405

vue中没有数据后一直在转_Vue.js 2.0 快速上手精华梳理

自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新手来说,如何高效快速的学习Vue2.0呢。Vue基础对于没有接触过es6和webpack的童鞋来说,不建议直接用官方的脚手架vue-cli构件项目。先按文档顺序最少学习完组件那一章。直接在html文件中引入vue.js开始学习,了解vue的基础指令,和整个vue实例的基础架构。vue的生命周期很重...

weixin_33526515的博客 280

VueJS 基础之组件

组件化的目的,是为了让页面中的各个部分可以被复用,以减少重复的代码。另一方面,也可以更好地使团队分工协作,让不同的人负责编写不同的组件。

两个月亮 1679

「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系

巩固你的vuejs知识体系序言一、vue2.x基础知识预备二、vue2.x基础知识常见面试题1. 请说出vue.cli项目中src目录每个文件夹和文件的用法?2. vue.cli中怎样使用自定义的组件?有遇到过哪些问题?3. v-show和v-if的区别4. 为何v-for中要用key5. 描述Vue组件生命周期(1)单组件生命周期(2)父子组件生命周期关系6. Vue组件如何通讯(常见)7. 描述组件渲染和更新的过程8. vue如何处理刷新数据不丢失9. 双向数据绑定 v-mo

moandaylab 4926

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

ranran0306的博客 9721

VueJS 之动态组件

在组件的动态切换过程中,存在组件的生成与销毁过程。在切换组件后,原组件将被销毁。再次切换为原组件时,由于组件经历了再生成的过程,组件中的数据都将处于初始状态。在实现组件的动态切换功能时,你可能会想保持这些组件的状态,以避免反复重新渲染导致的性能问题。我们可以使用 keep-alive 元素达成该目的。

两个月亮 6441
上一篇: vue基础篇之组件1
下一篇: vue基础之组件3
keep789
博客等级 码龄9年 73粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值