Vue入门四(组件介绍与定义|组件之间的通信)

文章目录

  • 一、组件介绍与定义
    • 介绍
    • 定义
      • 1)全局组件
      • 2)局部组件
  • 二、组件之间的通信
    • 1)父组件向子组件传递数据
    • 2)子传父通信

一、组件介绍与定义

介绍

组件(Component)是Vue.js 最强大的功能之一,它是html、css、js等的一个聚合体。封装性和隔离性非常强。

组件相当于Python中的模块,扩展HTML元素,可以重复使用的代码,使用它就是为了重复使用

例如:一个轮播图需要使用放到很多页面当中使用,一个轮播图有它自己的js、css、html,而组件就可以快捷的做出一个轮播图,有自己的js、css、html放到一起,有自己的逻辑样式这样到哪里都可以使用了,无需在写重复代码

  • 模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一;
  • 组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用。

定义

1)全局组件

语法

Vue.component('组件名称', { }),第1个参数是标签名称,第2个参数是一个选项对象。全局组件注册后,任何vue实例都可以用。

组件注意事项:

  1. 构造Vue实例时,传入的各种选项大多数可以在组件里使用(el不能使用),只有一个例外:data必须是函数,同时这个函数要求返回一个对象,保证数据唯一性,防止对象发生污染。
  2. 组件模版必须是单个根元素(html标签)
  3. 组件模版的内容可以是模版字符串
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	
	<body>
	
	    <div id="div">
	        <h1>组件</h1>
	        <button @click="handleClick">点击显示</button>
	        <hr>
	        <!--全局组件-->
	        <child v-if="show==true"></child>
	    </div>    
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	               show:false,
	            },
	            methods:{
	                handleClick(){
	                    this.show=!this.show
	                }
	            }
	        })
	
			//定义全局组件,一次定义,随时使用
			//一但声明完成,就可以在所有的组件中直接使用,无需引入和注册
	        Vue.component('Child',{
	        	//模版字符串
	            template:`
	                <div>
	                    <h1>{{name}}</h1>
	                    <button @click="clickname">点击更改名字</button>
	                </div>
	            `,
	            /*
				render 用于直接生成虚拟dom(生成标签)
		        在工程化中,render中可以直接写jsx,在引入一个babel可以写jsx语法(js的增强版本)
		        render(h) {
		            // h(生成的标签名称,标签中有哪些属性(没有属性就是null),子元素是什么)
		            let vnode = h('h3', { attrs: { name: 'abc', style: 'color:red' } }, '我是一个标签')
		            return vnode
		        }
				*/
	            data(){
	                return{
	                    name:'tom',
	                }
	            },
	            methods:{
	                clickname(){
	                    this.name='jack'
	                }
	            }
	        })
	
	    </script>
	</body>
	
	</html>

没有使用工程化时,我们使用浏览器解析标签,所以定义组件不能使用单标签写法,否则组件无法被多次执行,因为但标签写法浏览器在解析的时候觉得有问题,不再执行后续标签。而在工程化中,我们会使用很多包来编译html标签,单标签写法是允许的


2)局部组件

单文件局部组件

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	<body>
	
	    <div id="div">
	        <child></child>
	    </div>    
	
	    <script>
	    	// 创建局部组件,它就是一个对象
		    // 局部组件,在创建完成后,如果你要给别人使用,一定要在配置中进行对应的配置
	        var child = {
	            template:`
	            <div>
	                <h1>自定的局部组件</h1>
	                {{title}}
	            </div>
	            `,
	            data(){
	                return {
	                    title:'hello world',
	                }
	            }
	        }
	
	
	        var vm = new Vue({
	            el:'#div',
	            data:{
	            },
	            methods:{
	            },
	            //局部组件要加s
	            components:{
	                 // key就是在使用时的标签名称
	                // value就是对应的局部组件对象
	                // child: child
	                // 简写
	                child
	            }
	        })
	
	    </script>
	</body>
	
	</html>

直接编写在组件内部的局部组件

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	<body>
	    <div id="div">
	        <child></child>
	        <hr>
	        <!--定义在内部的局部组件需要写在上一层组局的template中-->
	        <mcq></mcq>
	    </div>    
	
	    <script>
	        var child = {
	            template:`
	            <div>
	                <h1>自定的局部组件</h1>
	                {{title}}
	            </div>
	            `,
	            data(){
	                return {
	                    title:'hello world',
	                }
	            }
	        }
	
	
	        //注意根组件与全局组件无任何关联关系,需放在根组件前面执行,否则会报错
	        //在全局组件内定义局部组件
	        Vue.component('mcq',{
	            template:`
	                <div>
	                    <h1>我是全局组件</h1>
	                    <xxx></xxx>
	                </div>
	            `,
	            data(){
	                return {}
	            },
	            //在内部定义的局部组件
	            components:{
	                xxx:{
	                    template:`
	                        <div>
	                            <h2>我是局部组件</h2>
	                        </div>
	                    `,
	                    data(){
	                        return {}
	                    },
	                }
	            }
	        })
	
	
	
	        var vm = new Vue({
	            el:'#div',
	            data:{
	            },
	            methods:{
	
	            },
	            //局部组件要加s
	            components:{
	                 // key就是在使用时的标签名称
	                // value就是对应的局部组件对象
	                // child: child
	                // 简写
	                child
	            }
	        })
	    </script>
	</body>
	</html>

二、组件之间的通信

组件与组件之间的嵌套使用避免不了数据之间的传递。那么Vue中组件的数据是如何传递的呢?组件间数据传递不同于Vue全局的数据传递,组件实例的数据之间是孤立的,不能在子组件的模板内直接引用父组件的数据。如果要把数据从父组件传递到子组件,就需要使用props属性。在Vue中,父子组件的关系可以总结为:prop向下传递,事件向上传递。父组件通过prop给子组件下发数据,子组件通过事件给父组件发送消息。所以我们也会经常遇到组件之间需要传递数据的时候,大致分为四种情况:

  • 父组件向子组件传递数据,通过props传递数据
  • 子组件向父组件传递数据,通过events(自定义事件—回调函数)传递数据。
  • 两个同级组件(兄弟组件)之间传递数据,通过EventBus(事件总线–只适用于极小的项目)、Vuex(官方推荐)传递数据
  • 其他方式通信-处理边界情况:
    • 1) $parent:父实例,如果当前实例有的话。通过访问父实例也能进行数据之间的交互,但极少情况下会直接修改父组件中的数据。
    • 2)$root:当前组件树的根 Vue 实例。如果当前实例没有父实例,此实例将会是其自己。
    • 3)$children:当前实例的直接子组件。需要注意 $children 并不保证顺序,也不是响应式的。如果你发现自己正在尝试使用 $children 来进行数据绑定,考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源。
    • 4) $ref:一个对象,持有注册过 ref attribute 的所有 DOM 元素和组件实例。访问子组件实例或子元素
    • 5) provide / inject。主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。并且这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

1)父组件向子组件传递数据

	1.通过自定义属性---自定义的变量不能用驼峰,不要与子组件中的变量冲突
   		父组件里 <child :name"name" ></child>
	2. 子组件中引用props,可以指定自定义属性的类型,也可以直接用数组
	    props:{name:String} // props:['name'] /可以接收多个
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	<body>
	    <div id="div">
	        <h1>组件通信之父传子:自定义属性</h1>
	        父组件中的名字:{{name}}
	        <hr>
	        <global :name="name"></global>
	    </div>    
	
	    <script>
	        
	        Vue.component('global',{
	            template:`
	                <div>
	                    <h2>我是global组件</h2>
	                    <h3>父组件传递给子组件的:{{name}}</h3>
	                </div>
	            `,
	            data(){
	                return{}
	            },
	            props:['name',]
	        })
	
	
	
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                name:'jack',
	            },
	            methods:{},
	        })
	
	    </script>
	</body>
	
	</html>

在这里插入图片描述


2)子传父通信

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	<body>
	    <div id="div">
	        <h1>组件通信之子传父:自定义事件</h1>
	        父组件接收的名字:{{p_name}}
	        <hr>
	        <global @myevent="handleEvent"></global>
	    </div>    
	
	    <script>
	        Vue.component('global',{
	            template:`
	                <div>
	                    <h2>我是global组件</h2>
	                    <input type="text" v-model="name">
	                    <button @click="handleSend">点击传递给父组件</button>
	                </div>
	            `,
	            data(){
	                return{
	                    name:'jack',
	                }
	            },
	            methods:{
	                handleSend(){
	                    this.$emit('myevent',this.name)
	                }
	            }
	        })
	
	
	
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                p_name:'',
	            },
	            methods:{
	                handleEvent(name){
	                    console.log('接收到了子组件传递的名字:'+name)
	                    this.p_name=name
	                }
	            },
	            
	        })
	
	
	    </script>
	</body>
	
	</html>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/308639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STK 特定问题建模(五)频谱分析(第二部分)

文章目录 简介三、链路分析3.1 星地链路干扰分析3.2 频谱分析 简介 本篇对卫星通信中的频谱利用率、潜在干扰对频谱的影响进行分析&#xff0c;以LEO卫星信号对GEO通信链路影响为例&#xff0c;分析星地链路频谱。 建模将从以下几个部分开展&#xff1a; 1、GEO星地通信收发机…

稀疏矩阵的三元组表示----(算法详解)

目录 基本算法包括&#xff1a;&#xff08;解释都在代码里&#xff09; 1.创建 2.对三元组元素赋值 3.将三元组元素赋值给变量 4.输出三元组 5.转置&#xff08;附加的有兴趣可以看看&#xff09; 稀疏矩阵的概念&#xff1a;矩阵的非零元素相较零元素非常小时&#xff…

极少数据就能微调大模型,一文详解LoRA等方法的运作原理

原文&#xff1a;极少数据就能微调大模型&#xff0c;一文详解LoRA等方法的运作原理 最近和大模型一起爆火的&#xff0c;还有大模型的微调方法。 这类方法只用很少的数据&#xff0c;就能让大模型在原本表现没那么好的下游任务中“脱颖而出”&#xff0c;成为这个任务的专家…

大气精美网站APP官网HTML源码

源码介绍 大气精美网站APP官网源码&#xff0c;好看实用&#xff0c;记事本修改里面的内容即可&#xff0c;喜欢的朋友可以拿去研究 下载地址 蓝奏云&#xff1a;https://wfr.lanzout.com/itqxN1ko2ovi CSDN免积分下载&#xff1a;https://download.csdn.net/download/huayu…

大型语言模型与知识图谱的完美结合:从LLMs到RAG,探索知识图谱构建的全新篇章

最近,使用大型语言模型(LLMs)和知识图谱(KG)开发 RAG(Retrieval Augmented Generation)流程引起了很大的关注。在这篇文章中,我将使用 LlamaIndex 和 NebulaGraph 来构建一个关于费城费利斯队(Philadelphia Phillies)的 RAG 流程。 我们用的是开源的 NebulaGraph 来…

redis 主从同步和故障切换的几个坑

数据不一致 当我们从节点读取一个数据时&#xff0c;和主节点读取的数据不一致&#xff0c;这是因为主从同步的命令是异步进行的&#xff0c;一般情况下是主从同步延迟导致的&#xff0c;为什么会延迟&#xff0c; 主要二个原因 1、网络状态不好 2、网络没问题&#xff0c;从节…

电脑找不到d3dcompiler43.dll怎么修复,教你5个可靠的方法

d3dcompiler43.dll是Windows操作系统中的一个重要动态链接库文件&#xff0c;主要负责Direct3D编译器的相关功能。如果“d3dcompiler43.dll丢失”通常会导致游戏无法正常运行或者程序崩溃。为了解决这个问题&#xff0c;我整理了以下五个解决方法&#xff0c;希望能帮助到遇到相…

怎么给IP证书更换IP地址

IP证书是由CA认证机构颁发的一种数字证书&#xff0c;可以为只有公网IP地址的网站提供数据加密服务。事实上&#xff0c;IP证书不仅可以提供加密传输服务&#xff0c;还可以验证网站的身份&#xff0c;保证数据传输的安全性。相对于传统基于域名的SSL证书&#xff0c;IP证书无需…

k8s-----存储卷(数据卷)

容器内的目录和宿主机的目录进行挂载。 容器的生命状态是短站的&#xff0c;delete删除&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消失。 容器和节点之间创…

【设计模式】创建型模式之单例模式(Golang实现)

定义 一个类只允许创建一个对象或实例&#xff0c;而且自行实例化并向整个系统提供该实例&#xff0c;这个类就是一个单例类&#xff0c;它提供全局访问的方法。这种设计模式叫单例设计模式&#xff0c;简称单例模式。 单例模式的要点&#xff1a; 某个类只能有一个实例必须…

vscode配置与注意事项

中文设置 https://zhuanlan.zhihu.com/p/263036716 应用搜索输入“Chinese (Simplified) Language Pack for Visual Studio Code”并敲回车键 底部信息窗没有的话 首先使用快捷键ctrlshiftp&#xff0c;Mac用户使shiftcommandp&#xff0c;然后输入settings.json 将下面的选…

C++其他语法总结

目录 《C基础语法总结》《C面向对象语法总结(一&#xff09;》《C面向对象语法总结(二&#xff09;》《C面向对象语法总结(三&#xff09;》 一、运算符重载 运算符重载可以为运算符增加一些新的功能全局函数、成员函数都支持运算符重载常用的运算符重载示例 class Point {…

【前端素材】bootstrap5实现绿色果蔬电商Frutin

一、需求分析 绿色果蔬电商网站是指专门提供绿色、有机、天然果蔬产品在线销售的电子商务平台。这类网站通常提供以下功能&#xff1a; 产品展示和搜索&#xff1a;网站上展示各种绿色果蔬产品的图片、描述、产地等信息。用户可以通过搜索功能查找特定的果蔬产品或根据分类浏览…

我的年度总结(大一程序员的自述)

呀哈喽&#xff0c;我是结衣。 我也来参加这个年度总结的话题咯&#xff0c;喜欢的话可以点个赞哦。 作为一个大一新生&#xff0c;我从1级的编程小白到了现在的2级编程小白。在7月份之前我可以说是完全不了解编程的一位新人&#xff0c;对应电脑的了解也就只会打游戏看电视和浏…

66、python - 代码仓库介绍

上一节,我们可以用自己手写的算法以及手动搭建的神经网络完成预测了,不知各位同学有没有自己尝试来预测一只猫或者一只狗,看看准确度如何? 本节应一位同学的建议,来介绍下 python 代码仓库的目录结构,以及每一部分是做什么? 我们这个小课的代码实战仓库链接为:cv_lea…

安达发|APS排程系统之产品工艺约束

在制造业中&#xff0c;生产计划和排程是至关重要的环节。为了提高生产效率、降低成本并满足客户需求&#xff0c;企业需要采用先进的生产计划和排程系统。APS&#xff08;Advanced Planning and Scheduling&#xff0c;高级计划与排程&#xff09;系统是一种集成了多种先进技术…

设计模式-规格模式

设计模式专栏 模式介绍模式特点应用场景规格模式和策略模式的区别和联系代码示例Java实现规格模式Python实现规格模式 规格模式在spring中的应用 模式介绍 规格模式&#xff08;Specification Pattern&#xff09;是一种行为设计模式&#xff0c;其目的是将业务规则封装成可重…

[后端] 微服务的前世今生

微服务的前世今生 整体脉络: 单体 -> 垂直划分 -> SOA -> micro service 微服务 -> services mesh服务网格 -> future 文章目录 微服务的前世今生单一应用架构特征优点&#xff1a;缺点&#xff1a; 垂直应用架构特征优点缺点 SOA 面向服务架构特征优点缺点 微服…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷④

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 模块一 …

Every Nobody Is Somebody 「每小人物都能成大事」

周星驰 NFT Nobody即将发售&#xff0c;Nobody共创平台 Every Nobody Is Somebody Nobody 关于Nobody&#xff1a;Nobody是一款Web3共创平台&#xff0c;旨在为创作者提供一个交流和合作的场所&#xff0c;促进创意的产生和共享。通过该平台&#xff0c;创作者可以展示自己的作…