vue.js组件的应用(Vite构建)

一.组件的定义和应用

1.全局组件

全局组件是指在任何页面中不必再单独引入组件并注册,直接在模板中使用组件名称就可以引用的组件。

全局组件注册方法一

先在src目录下新建一个globalComponents文件夹,再新建一个Header.vue的全局组件。

<template><div>全局组件Header</div>
</template><script>
export default {name: 'Header' //以大写字母开头的组件名称
}
</script>

进入main.js, 进行全局组件的注册,代码如下:

import { createApp } from 'vue'
import App from './App.vue'//引入全局组件Header,注意vite启动的项目引入Header的路径需要加后缀.vue
import Hearder from './globalComponents/Header.vue'//初始化实例
const app = createApp(App)// 使用component方法注册全局组件
app.component('Header', Hearder)//将实例挂载到#app标签上
app.mount('#app')

注册为全局组件后,进入App.vue, 引用全局组件,代码如下:

<template><div><Header></Header></div>
</template>
<script>
export default {}
</script>

启动项目,渲染效果如下,则渲染成功
在这里插入图片描述

全局组件注册方法二

在globalComents文件夹下新建Footer.vue

<template><div>全局组件Footer</div>
</template><script>
export default {name: 'Footer' //以大写字母开头的组件名称
}
</script>

注意,name要写上,否则后续不方便定义名称

与方法一不同的是,在globalComponents下新建index.js,用于注册全局组件

import Header from './Header.vue'
import Footer from './Footer.vue'//定义组件,将组件填入
const components = [Header, Footer]export default {install (app) {//利用数组的foreach循环,注册全局组件components.forEach(item => {app.component(item.name, item)})}
}

修改main.js,如下

import { createApp } from 'vue'
import App from './App.vue'
import GlobalComponents from './globalComponents'//引入自定义的全局组件库//初始化实例
const app = createApp(App)//使用实例的use方法,传入自定义全局组件库
app.use(GlobalComponents)//将实例挂载到#app标签上
app.mount('#app')

在App.vue脚本中,引入组件库的Header和Footer两个组件

<template><div><Header></Header><Footer></footer></div>
</template>
<script>
export default {}
</script>

运行一下,全局配置成功
在这里插入图片描述

2.局部组件

在src/components下写一个Test.vue

<template><div>局部组件</div>
</template><script>
export default {name: 'Test' //以大写字母开头的组件名称
}
</script>

在App.vue中引入Test

<template><div><Header></Header><Footer></footer><Test></Test></div>
</template>
<script>
// 引入Test组件
import Test from './components/Test.vue'
export default {components: {//注册Test组件Test}
}
</script>

注意,引入局部组件,其他的vue并不能直接使用该组件,上述< Test >可以用小写< test >

  components: {//注册Test组件NickTest:Test}

也可以用驼峰命名,使用时则用中横线

<nick-test></nick-test>

3.动态组件

Vue提供了一个关键字is,通过v-bind:is=“组件名”,修改is的组件名从而达到更换,组件的注册方法上面已经讲过了,就不举例说明了。

二,组件间的值传递

1.父子组件通信

创建Son.vue组件

<template><div>我是子组件</div><!-- 将父组件传进来的值展示在模板上 --><div>count: {{ count }}</div>
</template><script>
export default {//定义传值的名称和类型,这里key需要和父组件传值的属性保持一致props: {count: String},setup (props) {//打印props属性下的count变量console.log("🚀 ~ file: Son.vue:14 ~ setup ~ props:", props)}    
}
</script>

在父组件App.vue中引入子组件,使用并传入count值,注意子组件一定要定义props属性,否则setup函数无法获取父组件的传的值

//父组件传值的方法
<Son count="1"></Son>
//其余代码同上面引入组件一样,在此省略

控制台成功打印父组件传的值
在这里插入图片描述

2.子传父

上面属于正向传递,反过来,子组件传值给父组件属于逆向传递,此时需要用emit方法,将子组件的内容返回父组件,修改Son.vue如下

<template><div>我是子组件</div><!-- 将父组件传进来的值展示在模板上 --><div>count: {{ count }}</div>
</template><script>
export default {//定义传值的名称和类型,这里key需要和父组件传值的属性保持一致props: {count: String},setup (props,ctx) {//打印props属性下的count变量console.log("🚀 ~ file: Son.vue:15 ~ setup ~ props:", props)ctx.emit('callback', '子组件执行callback')}    
}
</script>

App.vue中添加下面代码:

<Son @callback="callback" count="1"></Son>

并添加setup函数

setup () {//传递给子组件返回内容的回调函数const callback = (val) => {console.log("🚀 ~ file: App.vue:23 ~ callback ~ val:", val)}return {callback}}

上面代码可以看出,值是在子组件中传过来,并在父组件里使用的,但实际上还是父传子,
这里是父组件用@关键字,将callback方法传递给子组件,子组件使用该回调方法,最终实现子传父。

3.兄弟组件通信

没有上下极关系,需要跨组件通信的方式,就是兄弟组件通信,虽然兄弟组件没有上下级关系,但他们会有一个共同的父组件,那么就能通过父组件为媒介,帮助两个组件通信。

分别创建Son1.vue和Son2.vue

<template><div>我是子组件1</div><!-- 将父组件传进来的值展示在模板上 --><div>Son2传的值: {{ count2 }}</div><button @click="change">传值给Son2</button>
</template><script>
export default {//定义传值的名称和类型,这里key需要和父组件传值的属性保持一致props: {//父组件定义一个count2,传值给子组件1count2: Number},setup (props,ctx) {//打印props属性下的count变量console.log("🚀 ~ file: Son.vue:15 ~ setup ~ props:", props)const change = () => {ctx.emit('callback', 111)}return {change}}    
}
</script>
<template><div>我是子组件2</div><!-- 将父组件传进来的值展示在模板上 --><div>Son1传的值: {{ count1 }}</div><button @click="change">传值给Son1</button>
</template><script>
export default {//定义传值的名称和类型,这里key需要和父组件传值的属性保持一致props: {//父组件定义一个count1,传值给子组件2count1: Number},setup (props,ctx) {//打印props属性下的count变量console.log("🚀 ~ file: Son.vue:15 ~ setup ~ props:", props)//触发父组件传递的方法const change = () => {ctx.emit('callback', 222)}return {change}}    
}
</script>

下面修改App.vue

<template><div><Son1 @callback="change1" :count2="count2"/><hr><Son2 @callback="change2" :count1="count1"/></div>
</template>
<script>
import {ref} from 'vue'
import Son1 from './components/Son1.vue'
import Son2 from './components/Son2.vue'
export default {components: {Son1,Son2},setup () {const count1 = ref(0)const count2 = ref(0)//传递给子组件返回内容的回调函数const change1 = (val) => {count1.value = val}const change2 = (val) => {count2.value = val}return {count1,count2,change1,change2}}}
</script>

简单来说,就是父组件和Son1通信,父组件和Son2通信,而通信的结果绑定在对方组件上,结果就显示为两个组件通信了。

这里还有种方式,就是事件总线(EventBus),简单介绍下,就是各组件将方法,参数都注册到一个池中,改池中的方法,参数其他组件都能获取,以此达到通信的目的,官方推荐第三发插件mitt,有兴趣的可以自行了解下。

4.祖孙组件通信

当祖孙组件中间套了很多层之后,用普通的父子通信会很难维护,代码也会很复杂,当他们想要通信时,可以用provide/inject来传值,祖先组件用provide定义值,孙子组件用inject获取值,代码逻辑和父子组件通信一样,大家可以自行了解。

总结

以上只是我对用vite构建vue3项目时,对于组件的一些理解和看法,比较浅显,希望对大家有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点&#xff0c;关于vue的路由守卫。也就是鉴权&#xff0c;不是所有的组件任何人都可以访问到的&#xff0c;需要权限&#xff0c;而根据权限…

Java经典框架之Spring

Java经典框架之Spring Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring简介 2.…

RabbitMQ不公平分发与预取值

1.分发简介 RabbitMQ不设置的话默认采用轮询方式分发消息,你一个我一个(公平);但实际生活中,由于处理速度不同,若还采用轮询方式分发会导致处理速度快的空等待,因此我们采用不公平分发 2.不公平分发 在消费者这侧设置即可,以之前的Worker3和Worker4为例 2.1.Worker3 packa…

通过windows cng api 实现rsa非对称加密

参考&#xff1a; 1,使用 CNG 加密数据 - Win32 apps | Microsoft Learn 2,不记得了 &#xff08;下文通过cng api演示rsa加密&#xff0c;不做原理性介绍&#xff09; 相对于aes等对称加密算法&#xff0c;rsa加密算法不可逆性更强。非对称加密在通常情况下&#xff0c;使…

异步消息原理

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 在日常开发中&#xff…

短链接技术解析:链接的简化之道

文章目录 前言起源实现原理常见短链接生成算法哈希算法自增计数随机生成基于关键字的生成 短链接的作用字符空间节省美化和简化个性化定制 实现一个简单的短链接服务个人简介 前言 大家在短信中是不是经常看到下面的短连接&#xff0c;简短易记&#xff1a; 看到这个时你是不是…

Python零基础教程5.0——无限画图下装逼

正方形的脸让我迷糊 引言开整完整代码1效果1完整代码2效果2完整代码3效果3 结尾 引言 哈哈&#xff0c;真巧 今天周末 有趣的人已经开始HAPPY 我只能码代码&#xff0c;写教程 不过&#xff0c;锻炼使我快乐&#xff01; 少年的苦&#xff0c;中年的甘&#xff0c;老年的甜 …

Mybatis-TypeHandler类型转换器

文章目录 TypeHandler 接口TypeHandler 注册TypeHandler 查询别名管理总结 TypeHandler 接口 TypeHandler 这个接口 就是Mybatis的类型转换器 /*** author Clinton Begin*/ public interface TypeHandler<T> {// 在通过PreparedStatement为SQL语句绑定参数时&#xff0…

智能优化算法应用:基于鹈鹕算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鹈鹕算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鹈鹕算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鹈鹕算法4.实验参数设定5.算法结果6.参考文献7.MA…

80x86汇编—汇编程序基本框架

文章目录 First Program指令系统伪指令数值表达式 程序框架解释int 21 中断 通过一个基本框架解释各个指令和用处&#xff0c;方便复习。所以我认为最好的学习顺序就是先看一段完整的汇编代码程序&#xff0c;然后给你逐个逐个的解释每一个代码是干嘛用的。然后剩下的还有很多指…

LTE之接口协议

一、接口协议栈 接口是指不同网元之间的信息交互方式。既然是信息交互&#xff0c;就应该使用彼此都能看懂的语言&#xff0c;这就是接口协议。接口协议的架构称为协议栈。根据接口所处位置分为空中接口和地面接口&#xff0c;响应的协议也分为空中接口协议和地面接口协议。空…

反序列化漏洞原理、成因、危害、攻击、防护、修复方法

反序列化漏洞是一种安全漏洞&#xff0c;它允许攻击者将恶意代码注入到应用程序中。这种漏洞通常发生在应用程序从不安全的来源反序列化数据时。当应用程序反序列化数据时&#xff0c;它将数据从一种格式&#xff08;例如JSON或XML&#xff09;转换为另一种格式&#xff08;例如…