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

news2024/11/16 3:28:58

文章目录

  • 一、组件介绍与定义
    • 介绍
    • 定义
      • 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>

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bootstrap搭建一个简单的官网案例附代码

bootstrap搭建一个简单的官网案例附代码 效果常用属性完整代码 效果 大概的效果如下 主要都是用bootstrap的代码实现的 网站是照着 b站视频做的 查看视频教程 建议自己先看一遍文档再跟着视频写&#xff0c;不然可能看不懂 bootstarp中文文档 logo是从别人的站上扒的有点不太协…

走进shell

Linux系统启动时&#xff0c;会自动创建多个虚拟控制台。虚拟控制台是运行在Linux系统内存中的终端会话。 打开Linux控制台Terminal使用tty命令查看当前使用的虚拟控制台。 注&#xff1a;tty 表示电传打字机(teletypewriter) $ tty /dev/pts/0表示当前使用的是/dev/pts/0 虚拟…

Python从入门到网络爬虫(23个Python开源项目)

前言 随着互联网的快速发展&#xff0c;大量的信息被不断地产生和积累&#xff0c;这也使得网络爬虫变得越来越重要。而Python作为一门高效、易用的编程语言&#xff0c;被广泛地应用于网络爬虫领域。本文将从多个角度分析Python开源爬虫项目的优缺点、应用场景以及未来发展方…

【AI之路】使用huggingface_hub通过huggingface镜像站hf-mirror.com下载大模型(附代码,实现大模型自由)

文章目录 前言一、Hugging face是什么&#xff1f;二、huggingface镜像站hf-mirror.com三、大模型一键下载1. 准备工作2. 下载代码 总结后记 前言 要玩AI大模型&#xff0c;Hugging face 不可错过&#xff0c;但资源虽不错&#xff0c;可奈何国内下载速度很慢&#xff0c;动则…

Java中CompletableFuture 异步编排的基本使用

一、前言 在复杂业务场景中&#xff0c;有些数据需要远程调用&#xff0c;导致查询时间缓慢&#xff0c;影响以下代码逻辑运行&#xff0c;并且这些浪费时间的逻辑与以后的请求并没有关系&#xff0c;这样会大大增加服务的时间。 假如商品详情页的每个查询&#xff0c;需要如下…

基于sprinmgboot实习管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而实习管理…

老铁,请收藏!IT人必备13个在线工具

本文根据很多很多大牛程序员分享&#xff0c;还请教了身边的资深职场人&#xff0c;给大家总结了一份大咖推荐的超实用网站合集&#xff0c;包含工具类和提效类&#xff0c;赶上要做年终汇报和来年计划的档口&#xff0c;80%你都用得上&#xff01; 先收藏&#xff0c;有需要随…

“第四个中国人民警察节”细语

今&#xff08;2024年1月10日&#xff09;天&#xff0c;是第四个中国人民警察节&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《一起致敬人民警察&#xff01;》。 图&#xff1a;来源“人民体验官”推广平台 笔者认同“平安的密码叫110”这个洽当比喻。因为人民…

Android App打包加固后的APK无法安装问题

最近开发的一个应用要上架&#xff0c;正常流程打完包后去加固&#xff0c;由于以前一直用的是360的加固助手&#xff0c;这里开始也是选择用它。 使用360加固&#xff1a; 问题一、开始出现的问题是说应用未签名无法加固&#xff0c;我明明是签名后打的包&#xff0c;怎么会…

世邦 IP网络对讲广播系统 getjson.php接口存在任意文件读取漏洞

产品简介 SPON世邦IP网络对讲广播系统是一种先进的通信解决方案&#xff0c;旨在提供高效的网络对讲和广播功能。 漏洞概述 SPON世邦IP网络对讲广播系统getjson.php接口处存在任意文件读取漏洞&#xff0c;未经身份验证的攻击者可利用此漏洞读取敏感文件。 指纹识别 fofa:…

ROS2——发布和订阅

现在我们以主题 int_topic 和发布者 publisher_node 和订阅者 subscriber_node 为例子进行展开。 头文件 在调用各种消息类型时&#xff0c;需要先引用头文件&#xff0c;才能成功声明某一个消息类型的变量。 我们在写头文件时&#xff0c;需要将该类成员的大写字母转换成小写…

文献阅读1

A Hierarchical Representation Network for Accurate and Detailed Face Reconstruction from In-The-Wild Images 会议/期刊&#xff1a;CVPR 2023&#xff1b;阿里达摩院&#xff1b;Biwen Lei 概述&#xff1a;这是一篇单张图片三维人脸重建的论文&#xff0c;这篇论文的…

LeetCode-棒球比赛(682)

题目描述&#xff1a; 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。 比赛开始时&#xff0c;记录是空白的。你会得到一个记录操作的字符串列表 ops&#xff0c;其中 ops[i] 是你需要记录的第…

STM32 使用 DS18B20 温度传感器实现环境温度监测

为了实现环境温度监测系统&#xff0c;我们可以利用STM32微控制器和DS18B20数字温度传感器。在本文中&#xff0c;我们将介绍如何通过STM32微控制器读取DS18B20传感器的温度数据&#xff0c;并展示一个简单的示例代码。 1. 系统概述 环境温度监测系统旨在使用DS18B20数字温度…

ssm基于Web的汽车客运订票系统的设计与实现论文

毕业设计&#xff08;论文&#xff09; 汽车客运订票系统 姓 名 ______________________ 学 号 ______________________ 班 级 ______________________ 专 业 ______________________ 院 部 ______________________ 指导教师 ______________________ 年 月 日 目 录 目 录 …

数据库管理-第130期 JSON二元性(20240109)

数据库管理130期 2024-01-09 第130期 JSON二元性&#xff08;20240109&#xff09;1 简介2 关系型表和JSON存储的优劣3 Oracle JSON关系型二元性视图总结 第130期 JSON二元性&#xff08;20240109&#xff09; 上周&#xff0c;又双叒飞了一趟上海&#xff0c;也是2024年第一飞…

10个最容易被忽视的 FastAPI 实用功能

FastAPI是一种现代、高性能的Python Web框架&#xff0c;用于构建Web应用程序和API。 它基于Python的异步编程库asyncio和await语法&#xff0c;以及类型注解和自动文档生成等特性&#xff0c;提供了快速、易用和可靠的开发体验&#xff0c;接下来本文将介绍10项被忽视的FastA…

设计模式篇章(3)——七种结构型模式

结构型设计模式主要思考的是如何将对象进行合理的布局来组成一个更大的功能体或者结构体&#xff0c;这个现在讲有点抽象&#xff0c;用大白话讲就是利用现有的对象进行组合或者配合&#xff0c;使得组合后的这个系统更加好。好是相对于不使用设计模式&#xff0c;按照自己的堆…

分布式全局id

分布式全局id snowflake 算法是 twitter 开源的分布式 id 生成算法&#xff0c;采用 Scala 语言实现&#xff0c;是把一个 64 位的 long 型的 id&#xff0c;1 个 bit 是不用的&#xff0c;用其中的 41 bits 作为毫秒数&#xff0c;用 10 bits 作为工作机器 id&#xff0c;12 …

Linux权限2

相关命令 chown [用户名] [文件]​ 更改文件拥有者&#xff08;加sudo强制更改&#xff09; chown [拥有者]:[所属组] [文件] 更改文件拥有者和所属组&#xff08;root权限下&#xff09; chgrp [用户名] [文件] 更改文件所属组 文件类型 输入ls或ll显示的文件&#xff…