vue学习笔记之组件传值

说起组件传值,首先要介绍再vue中什么是组件。

组件(Component),是vue中很强大的一个功能,可以将一些可重用的代码进行重用。所有的vue组件同时也是vue实例,可以接受使用相同的选项对象和提供相同的生命周期钩子。用一句话来概括:组件就是可以扩展的HTML元素,封装可重用的HTML代码,可以将组件看做自定义的HTML元素。在vue项目中,所有.vue结尾的文件都是一个组件。

注意:注意组件和hooks的区别,一句话来说:组件是封装UI的,hooks的封装逻辑的。

组件分类

组件可以分为两类,分别是局部组件和全局组件

(1)局部组件

引入组件后,需要在components对象里进行注册,注册后可以直接进行使用。(注意:在setup语法糖出来之前是这样的,但是在使用了setup语法糖后,就不需要进行注册了,引入后可以直接使用)

插入setup语法糖的相关知识:<script setup>
Vue 3 引入了一个新的 <script setup> 语法,它提供了一种更简洁的方式来编写组件。在使用 <script setup> 时,你可以通过 import 语句直接引入组件,而无需显式注册。然后,你就可以在模板中直接使用这些组件了:

<template>  <my-component />  
</template>  <script setup>  
import MyComponent from './MyComponent.vue';  
// 在这里直接引入组件,模板中即可使用,无需注册步骤  
</script>

请注意,<script setup> 是 Vue 3.2+ 中的一项实验性功能,它简化了组件的编写方式。在这个语法中,导入的组件会自动在模板中可用,无需显式在 components 选项中注册。

综上所述,虽然 Vue 3 中的组件注册方式有所变化,但无论是全局还是局部注册,或者是使用 <script setup>,你仍然需要以某种方式“引入”或“注册”你的组件,以便在模板中使用它们。

转回来,在局部组件中,我们引入组件后,需要在components对象里进行注册,注册后可以直接进行使用。

上代码:
 

<template><div><div>使用组件</div><!-- <TestComponent :num="num"></TestComponent> --><TestComponent num2="2" @handle="handle2('666',$event)"></TestComponent><!-- <TestComponent></TestComponent><TestComponent></TestComponent> --><button @click="num+=1">加一</button><GlobalComponent Mypro="编辑" color="red" :num="num"></GlobalComponent><GlobalComponent Mypro="修改" color="blue"></GlobalComponent><GlobalComponent Mypro="删除" color="yellow"></GlobalComponent></div>
</template><script>
import TestComponent from './testComponent.vue';
// import testComponent from './testComponent.vue';export default {data(){return{num:1}},components:{TestComponent},methods:{handle2(parent,child){console.log('父组件传递的数据',parent);console.log('子组件传递的数据',child);}}
}</script><style></style>

在代码中,TestComponent就是一个局部组件,在script中进行注册,在template中以标签的形式进行使用。

我们看一下TestComponent.vue的内容

 (2)全局组件

这里的重点不是将什么是全局组件,什么是局部组件,下面也是简单介绍一下全局组件的注册与使用,注意它和局部组件的注册是不同的。
在 Vue 2 中,全局注册一个组件:
Vue.component('my-component', MyComponent);


在 Vue 3 中,由于没有了全局的 Vue 实例,你需要通过应用实例(由 createApp 创建)来全局注册组件:
import { createApp } from 'vue';  
import MyComponent from './MyComponent.vue';  
  
const app = createApp({});  
  
app.component('my-component', MyComponent);  
  
app.mount('#app');

组件传值

下面来到重点,组件传值,总体可以分为三类:父与子,祖与孙,兄弟之间的传值。

注意:在组件之间的关系,比如父子关系是相对的,一个组件是另一个组件的父组件,但是这个父组件也可能是其他组件的子组件或孙组件等。

①父传子

一句话概括:在父组件的子组件标签上定义属性,子组件使用props接收

上代码:

在该组件中,我们使用了TestComponent组件,那么这个组件和使用的组件之间就构成了父子关系,我们想给子组件 TestComponent组件传值(父传子),就需要在子组件的标签竖向上写上传递的属性(注意:此属性以子组件为准)num2,其值为2,那么来到子组件这边。

使用props进行接收,它右边的接收形式有两种,一种是数组,另一种是对象,只不过对象那个没必要,就使用常用的数组形式即可。(注意:这里传递过来的属性需要加引号,小编就因为没有加引号报错了)。

 这样,父传子就成功传递了。

②子传父

通过事件传递,子组件使用$emit传递一个事件给父组件。$emit第一个参数是事件名,第二个参数要传给父组件的参数。父组件在子组件标签上使用@接收传过来的事件

上代码:

在子组件中传递一个事件

子组件传递了handle事件,并且传递了一个值123

来到父组件这里,

 使用@符号加上子组件传递过来的事件名,在父组件中,也传递了自己的值,如果想要获取子组件传递过来的值,和一开始的事件默认事件一样,也是使用$event。

来看效果:

来看handle2的代码:

 第一个参数是父组件自己传递的值,后面的是$event获取的子组件的值。

③祖孙传值

provide / inject 依赖注入
provide:可以让我们指定想要提供给后代组件的数据或方法
inject:在任何后代组件中接收想要添加在这个组件上的数据或方法,不管组件嵌套多深都可以直接拿来用

先看结构关系

grandFather.vue

<!--* @Author: RealRoad1083425287@qq.com* @Date: 2024-07-07 19:04:28* @LastEditors: Mei* @LastEditTime: 2024-07-07 20:10:22* @FilePath: \Fighting\new_project_0705\my-vue-app\src\components\grantFather.vue* @Description: * * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
-->
<template><div><Parent></Parent></div>
</template><script>
import Parent from "./parent.vue"export default {components:{Parent},provide(){return{name:"张三"}}
}</script><style scoped></style>

 parent.vue

<template><div><Son></Son></div>
</template><script>
import Son from "./son.vue"
export default {
components:{Son
}
}</script><style scoped></style>

son.vue

<!--* @Author: RealRoad1083425287@qq.com* @Date: 2024-07-07 19:03:41* @LastEditors: Mei* @LastEditTime: 2024-07-07 19:15:10* @FilePath: \Fighting\new_project_0705\my-vue-app\src\components\son.vue* @Description: * * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
-->
<template><div>我是后代组件--{{ name }}</div>
</template><script>
export default {inject:['name']
}</script><style scoped></style>

来看运行效果,在祖先组件中,我们使用了parent组件,而在parent组件中,使用了son组件,这样就构成了祖孙关系,在上级组件进行provide下发name,而在后代组件中使用inject进行注入。

在vue调试工具中也可以看到下发的name属性

 ④兄弟传值

一般使用状态管理解决
event bus
EventBus 是中央事件总线,不管是父子组件,兄弟组件,跨层级组件等都可以使用它完成通信操作。
在 Vue 3 中,由于 Vue 2 中的全局事件总线(Vue.prototype.$emit 和 Vue.prototype.$on)被移除,我们需要使用其他方式来实现类似的功能。在 Vue 3 中,可以使用 mitt 这个第三方库来创建一个事件总线。

介绍一下使用Vuex实现兄弟传值

在Vue.js项目中,Vuex通常被用作状态管理库,尤其是在大型或复杂的应用中,它提供了一种集中管理所有组件共享状态的方式。对于兄弟组件之间的通信,Vuex可以作为一个很好的解决方案,因为它允许状态被全局访问和修改。

1. 安装和设置Vuex


首先,确保你的项目中已经安装了Vuex。如果还没有安装,可以通过npm或yarn来安装:


npm install vuex --save  
# 或者  
yarn add vuex


然后,在你的Vue项目中设置Vuex。通常,这会在src/store目录下完成,但你可以根据项目的需要进行调整。

2.使用Vuex并配置store


// src/store/index.js  
import Vue from 'vue';  
import Vuex from 'vuex';  
  
Vue.use(Vuex);  
  
export default new Vuex.Store({  
  state: {  
    message: ''  
  },  
  mutations: {  
    setMessage(state, message) {  
      state.message = message;  
    }  
  }  
});


3. 在Vue实例中使用Vuex


在你的Vue实例(通常是main.js或app.js)中,你需要引入并使用Vuex store。


// src/main.js  
import Vue from 'vue';  
import App from './App.vue';  
import store from './store';  
  
new Vue({  
  store,  
  render: h => h(App),  
}).$mount('#app');


4.在兄弟组件中使用Vuex


假设你有两个兄弟组件BrotherOne.vue和BrotherTwo.vue,你想从BrotherOne传递一个消息到BrotherTwo。

BrotherOne.vue

<template>  <div>  <input v-model="localMessage" @input="updateMessage">  <button @click="sendMessage">Send Message</button>  </div>  
</template>  <script>  
export default {  data() {  return {  localMessage: ''  };  },  methods: {  updateMessage() {  // 这里可以添加逻辑来过滤或格式化消息  },  sendMessage() {  this.$store.commit('setMessage', this.localMessage);  }  }  
};  
</script>


BrotherTwo.vue

<template>  <div>  <p>Received Message: {{ message }}</p>  </div>  
</template>  <script>  
export default {  computed: {  message() {  return this.$store.state.message;  }  }  
};  
</script>


BrotherOne组件通过input和button来更新和发送消息。当点击按钮时,它调用this.$store.commit('setMessage', this.localMessage);来触发Vuex中的setMessage mutation,该mutation将新的消息存储在Vuex的state中。

BrotherTwo组件则通过计算属性message来监听Vuex state中的message变化,并实时显示在页面上。

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

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

相关文章

高考志愿填报千万要注意这四点

在高考志愿填报过程中&#xff0c;确实有很多需要留心的点。我为你总结了四个关键点&#xff0c;希望能帮助你顺利完成志愿填报&#xff1a; 1、学校提供的支持 学校作为学生志愿填报咨询服务的主阵地&#xff0c;应提供体系化和制度化的支持。包括及时关注并传达政策动向和相…

Spring AOP源码篇三之 xml配置

简单代码示例, 了解Spring AOP基于xml的基本用法 xml配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

数学系C++ 排序算法简述(八)

目录 排序 选择排序 O(n2) 不稳定&#xff1a;48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化&#xff1a; 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

Linux—网络设置

目录 一、ifconfig——查看网络配置 1、查看网络接口信息 1.1、查看所有网络接口 1.2、查看具体的网络接口 2、修改网络配置 3、添加网络接口 4、禁用/激活网卡 二、hostname——查看主机名称 1、查看主机名称 2、临时修改主机名称 3、永久修改主机名称 4、查看本…

Polkadot(DOT)即将爆雷?治理无能还歧视亚洲!资金将在两年内耗尽!是下一个FTX吗?

近期&#xff0c;关于Polkadot(DOT)生态圈的一系列负面消息引发了业界和投资者的广泛关注。从高昂的营销开支、缺乏实际业务亮点&#xff0c;再到治理问题和种族歧视指控&#xff0c;Polkadot似乎正面临着严峻的危机。业内人士警告&#xff0c;Polkadot的财政状况堪忧&#xff…

一个最简单的comsol斜坡稳定性分析例子——详细步骤

一个最简单的comsol斜坡稳定性分析例子——详细步骤 标准模型例子—详细步骤 线弹性模型下的地应力平衡预应力与预应变、土壤塑性和安全系数求解的辅助扫描

Vue2前端实现数据可视化大屏全局自适应 Vue实现所有页面自适应 Vue实现自适应所有屏幕

Vue自适应所有屏幕大小,目前页面自适应,尤其是数据可视化大屏的自适应更是案例很多 今天就记录一下使用Vue全局自适应各种屏幕大小的功能 在Vue.js中创建一个数据大屏,并使其能够自适应不同屏幕大小,通常涉及到布局的响应式设计、CSS媒体查询、以及利用Vue的事件系统来处理…

非同步升压转换器,效率95%你信吗?ETA1611输出电流2A, 22V DCDC

前言&#xff1a; 截止24年7月7日某创报价&#xff1a;500&#xff1a; &#xffe5;0.7856 / 个 建议使用前同时了解下方器件。 2毛钱的SOT23-5封装28V、1.5A、1.2MHz DCDC转换器用于LCD偏置电源和白光LED驱动等MT3540升压芯片 描述 ETA1611 SOT23-6封装 丝印GVYW&#xff0…

对话大模型Prompt是否需要礼貌点?

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的QA数据集构建&#xff08;附代码&#xff09;Qwen-2-7B和GLM-4-9B&#x…

YOLOv8结合SAHI推理图像和视频

文章目录 前言视频效果必要环境一、完整代码二、运行方法1、 推理图像2、 推理视频 总结 前言 在上一篇文章中&#xff0c;我们深入探讨了如何通过结合YOLOv8和SAHI来增强小目标检测效果 &#xff0c;并计算了相关评估指标&#xff0c;虽然我们也展示了可视化功能&#xff0c;…

入门PHP就来我这(高级)13 ~ 图书添加功能

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 今天给大家接着上篇文章编写图书添加功能。 1 添加页面 创建add.html页面样式&#xff0c;废…

去O化神器 Exbase

随着去O化进程推动&#xff0c;很多旧业务依赖的oracle数据库&#xff0c;都需要实现做数据库的替换&#xff0c;当下能很好兼容Oracle&#xff0c;并实现异构数据库之间转换的工具并不多。这里给大家推荐一个商业工具数据库迁移工具exbase&#xff08;北京海量&#xff09;&am…

排序格式排序格式

排序格式排序格式

CosyVoice - 阿里最新开源语音克隆、文本转语音项目 支持情感控制及粤语 本地一键整合包下载

近日&#xff0c;阿里通义实验室发布开源语音大模型项目FunAudioLLM&#xff0c;而且一次包含两个模型&#xff1a;SenseVoice和CosyVoice。 CosyVoice专注自然语音生成&#xff0c;支持多语言、音色和情感控制&#xff0c;支持中英日粤韩5种语言的生成&#xff0c;效果显著优于…

Java多线程不会?一文解决——

方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例&#xff1a; class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…

深度学习中的Channel,通道数是什么?

参考文章&#xff1a; 直观理解深度学习的卷积操作&#xff0c;超赞&#xff01;-CSDN博客​​​​​​如何理解卷积神经网络中的通道&#xff08;channel&#xff09;_神经网络通道数-CSDN博客 深度学习-卷积神经网络—卷积操作详细介绍_深度卷积的作用-CSDN博客 正文&…

土豆炒肉做法

菜单&#xff1a;土豆、葱、铁辣子、纯瘦肉、淀粉、生抽、酱油、刀、案板、十三香、盐巴、擦板 流程&#xff1a; 洗土豆&#xff0c;削皮&#xff0c;擦成条&#xff0c;用凉水过滤两遍淀粉&#xff0c;顺便放个燥里洗肉&#xff0c;切成条&#xff0c;按照生抽、酱油、淀粉、…

QT入门笔记-自定义控件封装 30

具体代码如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

vue3项目 前端blocked:mixed-content问题解决方案

一、问题分析 blocked:mixed-content其实浏览器不允许在https页面里嵌入http的请求&#xff0c;现在高版本的浏览器为了用户体验&#xff0c;都不会弹窗报错&#xff0c;只会在控制台上打印一条错误信息。一般出现这个问题就是在https协议里嵌入了http请求&#xff0c;解决方法…

react dangerouslySetInnerHTML将html字符串以变量方式插入页面,点击后出现编辑状态

1.插入变量 出现以下编辑状态 2.解决 给展示富文本的标签添加css样式 pointerEvents: none