VUE3中的组件传值

一、父传子(props)

在子组件中可以使用defineProps接收父组件向子组件的传值

父组件fatherPage.vue:

<template><div class="father"><button @click="a = a + 1">按钮</button><childPage :a="a" /></div>
</template><script lang="ts" setup>
import { ref } from "vue";
import childPage from "./childPage.vue";
const a = ref<number>(0);
</script>
<style scoped lang="less">
.father {width: 100%;height: 100vh;background-color: rgb(7, 14, 17);display: flex;justify-content: center;align-items: center;button {width: 100px;height: 60px;cursor: pointer;}
}
</style>

子组件childPage.vue:

<template><div class="childPage">{{ a }}</div>
</template>
<script lang="ts" setup>
import { computed, defineProps } from "vue";
// 含默认值
// const porps = defineProps({
//   a: {
//     type: Number,
//     default: 0,
//   },
// });
const props = defineProps({ a: Number });
// 用computed使用props
const a = computed(() => props.a);
</script>
<style scoped lang="less">
.childPage {width: 100px;height: 60px;background-color: rgba(0, 0, 0, 0);display: flex;justify-content: center;align-items: center;color: #ffffff;
}
</style>

效果:

二、子传父(emits)

在子组件中可以使用defineEmits向父组件传递信息。

父组件fatherPage.vue:

<template><div class="father">{{ a }}<childPage @update:a="update" /></div>
</template><script lang="ts" setup>
import { ref } from "vue";
import childPage from "./childPage.vue";
const a = ref<number>(0);
const update = (emitValue: number) => {a.value = emitValue;
};
</script>
<style scoped lang="less">
.father {width: 100%;height: 100vh;background-color: rgb(7, 14, 17);color: #ffffff;display: flex;justify-content: center;align-items: center;button {width: 100px;height: 60px;cursor: pointer;}
}
</style>

子组件childPage.vue:

1.通过点击触发emit传值

<template><div class="childPage"><button @click="updateA">按钮</button></div>
</template><script lang="ts" setup>
import { ref, defineEmits } from "vue";const a = ref<number>(0);
const emit = defineEmits(["update:a"]);
const updateA = () => {a.value++;emit("update:a", a.value);
};
</script><style scoped lang="less">
.childPage {width: 100px;height: 60px;button {width: 100%;height: 100%;cursor: pointer;}
}
</style>

效果:

2.通过watch监听值的变化进行传值:

<template><div class="childPage"><button @click="updateA">按钮</button></div>
</template><script lang="ts" setup>
import { ref, defineEmits, watch } from "vue";const a = ref<number>(0);
const emit = defineEmits(["update:a"]);
const updateA = () => {a.value++;setTimeout(() => {updateA();}, 1000);
};
watch(a, (newValue) => {emit("update:a", newValue);
});
</script><style scoped lang="less">
.childPage {width: 100px;height: 60px;button {width: 100%;height: 100%;cursor: pointer;}
}
</style>

效果:

三、父子组件进行双向绑定(v-model)

在子组件中可以使用defineModel与父组件进行双向绑定。注意:defineModel在vue3.3版本实验性使用,稳定版在vue3.4。

父组件:

<template><div class="father">{{ a }}<childPage v-model="a" /></div>
</template><script lang="ts" setup>
import { ref } from "vue";
import childPage from "./childPage.vue";
const a = ref<number>();
</script>
<style scoped lang="less">
.father {width: 100%;height: 100vh;background-color: rgb(7, 14, 17);color: #ffffff;display: flex;justify-content: center;align-items: center;button {width: 100px;height: 60px;cursor: pointer;}
}
</style>

子组件:

<template><div class="childPage"><button @click="updateA">按钮</button></div>
</template><script lang="ts" setup>
import { defineModel } from "vue";const a = defineModel({type: Number,default: 0,
});const updateA = () => {a.value += 1;
};
</script><style scoped lang="less">
.childPage {width: 100px;height: 60px;button {width: 100%;height: 100%;cursor: pointer;}
}
</style>

效果:

四、使用vuex进行组件通信

使用vuex可以进行组件之间的通信,父子组件与兄弟组件均可

在vuex文件index.ts中:

import { createStore } from "vuex";export default createStore({state: {number: 0,},getters: {},mutations: {changeNumber(state, payload) {state.number = payload;},},actions: {},modules: {},
});

在第一个组件HomeView中:

<template><div class="father">{{ a }}<AboutView /></div>
</template><script lang="ts" setup>
import { computed } from "vue";
import { useStore } from "vuex";
import AboutView from "./AboutView.vue";
const store = useStore();
const a = computed(() => store.state.number);
</script>
<style scoped lang="scss">
.father {width: 100%;height: 100vh;background-color: rgb(7, 14, 17);color: #ffffff;display: flex;justify-content: center;align-items: center;
}
</style>

在第二个组件AboutView中:

<template><div class="childPage"><button @click="updateA">按钮</button></div>
</template><script lang="ts" setup>
import { useStore } from "vuex";const store = useStore();
let a = 0;const updateA = () => {a++;store.commit("changeNumber", a);
};
</script><style scoped lang="scss">
.childPage {width: 100px;height: 60px;button {width: 100%;height: 100%;cursor: pointer;}
}
</style>

效果:

五、使用pinia进行组件通信

pinia有着与vuex类似的功能,同样可以实现组件间的通信。

在store的index.ts文件中:

import { defineStore } from "pinia";
import { ref } from "vue";
export const useCounterStore = defineStore("counter", () => {const count = ref(0);const changeCount = () => {count.value++;};return { count, changeCount };
});

在第一个组件fatherPage中:

<template><div class="father">{{ count }}<childPage /></div>
</template><script lang="ts" setup>
import childPage from "./childPage.vue";
import { useCounterStore } from "../store/index";
import { storeToRefs } from "pinia";
const store = useCounterStore();
const { count } = storeToRefs(store);
</script>
<style scoped lang="less">
.father {width: 100%;height: 100vh;background-color: rgb(7, 14, 17);color: #ffffff;display: flex;justify-content: center;align-items: center;button {width: 100px;height: 60px;cursor: pointer;}
}
</style>

在第二个组件childPage中:

<template><div class="childPage"><button @click="changeCount">按钮</button></div>
</template><script lang="ts" setup>
import { useCounterStore } from "../store/index";
const store = useCounterStore();
const { changeCount } = store;
</script><style scoped lang="less">
.childPage {width: 100px;height: 60px;button {width: 100%;height: 100%;cursor: pointer;}
}
</style>

效果:

六、使用事件总线进行组件通信

我们可以利用第三方库比如说mitt以事件总线的方式实现传值

在mitt的index.ts中:

import mitt from "mitt";
const emitter = mitt();
export default emitter;

在第一个组件fatherPage中:

<template><div class="father">{{ count }}<childPage /></div>
</template><script setup>
import childPage from "./childPage.vue";
import emitter from "@/mitt/index";
import { ref } from "vue";
const count = ref(0);
emitter.on("changeCount", (counter) => {count.value = counter;
});
</script>
<style scoped lang="less">
.father {width: 100%;height: 100vh;background-color: rgb(7, 14, 17);color: #ffffff;display: flex;justify-content: center;align-items: center;button {width: 100px;height: 60px;cursor: pointer;}
}
</style>

在第二个组件childPage中:

<template><div class="childPage"><button @click="changeCount">按钮</button></div>
</template><script setup>
import emitter from "../mitt/index";
let a = 0;
const changeCount = () => {a++;emitter.emit("changeCount", a);
};
</script><style scoped lang="less">
.childPage {width: 100px;height: 60px;button {width: 100%;height: 100%;cursor: pointer;}
}
</style>

效果:

七、更详细使用方式请参考以下文档

1,Vue.js - 渐进式 JavaScript 框架 | Vue.js

2,开始 | Vuex

3,Pinia | Pinia 中文手册 - 官网同步更新 v2.0.28

4,GitHub - developit/mitt: 🥊 Tiny 200 byte functional event emitter / pubsub.

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

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

相关文章

Nginx 隐藏版本信息和logo

1.隐藏版本信息 http {### 隐藏版本号 server_tokens off; } 2.隐藏图标 2.1 cd nginx 安装的路径 cd/XXXX/nginx-1.2.0 2.2 编辑文件 vim src/core/nginx.h 修改define nginx_ver 中的内容 vim src/http/ngx_http_special_response.c 修改 u_char ngx_http_error_tail[]…

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习&#xff0c;上部分就是对于java的基础知识&#xff0c;面向对象上&#xff0c;面向对象下&#xff0c;异常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读 摘要简介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 实验结果5 总结 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/2402.18293 源码…

【MIT 6.S081】2020, 实验记录(6),Lab: Copy-on-Write Fork

目录 Task: Implement copy-on writestep 1&#xff1a;对内存块进行引用计数step 2&#xff1a;uvmcopy 实现 fork 时将 parent 的物理页映射到 child 中step 3&#xff1a;在 usertrap 中增加对 page fault 的处理执行测试 官方说明&#xff1a;Lab: Copy-on-Write Fork for …

C++进阶-- map和set

关联式容器 在前面&#xff0c;我们所学的vector、list、deque&#xff0c;这些都是序列容器&#xff0c;也就是底层为线性序列的数据结构。 而关联式容器是C标准库中的一种类别&#xff0c;用于存储键值对&#xff08;key-value pair&#xff09;&#xff0c;关联式容器中的元…

vxe-table编辑单元格动态插槽slot的使用

业务场景&#xff1a;表格中只有特定某一行的的单元格可以编辑&#xff0c;列很多&#xff0c;为每个列写个插槽要写很多重复代码&#xff0c;所以这里使用动态插槽&#xff0c;简化代码量。显示编辑图标&#xff0c;点击编辑图标隐藏。失去焦点保存调后台接口。 解决办法&…

十行代码开发一个AI应用

Semantic Kernal 简介 Semantic Kernel (SK) is a lightweight SDK that lets you easily mix conventional programming languages with the latest in Large Language Model (LLM) AI "prompts" with templating, chaining, and planning capabilities out-of-the-…

关于vue中关于eslint报错的问题

1 代码保存的时候会自动将单引号报错为双引号 导致eslint报错的问题&#xff0c; 解决思路&#xff1a; 在项目根目录下新建一个.prettierrc.json文件 { “tabWidth”: 2,“useTabs”: false,“singleQuote”: true,“semi”: false} 2 关于报错代码的时候 出现尾随逗号报错…

Zabbix 系统告警“More than 75% used in the configuration cache”处理办法

Zabbix系统报错提示 Zabbix 系统告警“More than 75% used in the configuration cache”&#xff0c;看了一下意思是可用的配置缓存超过75%。 修改缓存大小 vim /etc/zabbix/zabbix_server.confesc : /CacheSize 找到配置 将64M改大一点&#xff0c;保存退出。 重启zabbix…

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…

Linux高负载排查最佳实践

在Linux系统中&#xff0c;经常会因为负载过高导致各种性能问题。那么如何进行排查&#xff0c;其实是有迹可循&#xff0c;而且模式固定。 本次就来分享一下&#xff0c;CPU占用过高、磁盘IO占用过高的排查方法。 还是那句话&#xff0c;以最佳实践入手&#xff0c;真传一句话…

数据库-第二/三章 关系数据库和标准语言SQL【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下计数据库系统概论中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 文章目录 前言第二、三章 关系数据库和标准语言SQL2.1 关系2…

JVM原理-基础篇

Java虚拟机&#xff08;JVM, Java Virtual Machine&#xff09;是运行Java应用程序的核心组件&#xff0c;它是一个抽象化的计算机系统模型&#xff0c;为Java字节码提供运行环境。JVM的主要功能包括&#xff1a;类加载机制、内存管理、垃圾回收、指令解释与执行、异常处理与安…

虚拟机内存不够用了?全流程操作Look一下?

虚拟机信息&#xff1a;操作系统&#xff1a;CentOS Linux 7 (Core)&#xff0c;用的是VMware Workstation 16 Pro 版本16.2.3 build-19376536&#xff1b;我的主机 Windows 10 Education, 64-bit (Build 22000.1817) 10.0.22000 前言&#xff1a;虚拟机用久了就会出现内存不足…

Rocky Linux 安装部署 Zabbix 6.4

一、Zabbix的简介 Zabbix是一种开源的企业级监控解决方案&#xff0c;用于实时监测服务器、网络设备和应用程序的性能和可用性。它提供了强大的数据收集、处理和可视化功能&#xff0c;同时支持事件触发、报警通知和自动化任务等功能。Zabbix易于安装和配置&#xff0c;支持跨平…

【前端素材】推荐优质后台管理系统网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业(2024)

对于OpenAI推出的Sora模型&#xff0c;我们可以进一步探讨其可能的技术细节、潜在应用以及对AI视频行业的影响。 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作…

【分类讨论】【割点】1568. 使陆地分离的最少天数

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 分类讨论 割点 LeetCode1568. 使陆地分离的最少天数 给你一个大小为 m x n &#xff0c;由若干 0 和 1 组成的二维网格 grid &#xff0c;其中 1 表示陆地&#xff0c; 0 表示水。岛屿 由水平方向或竖直方向上相邻的 1 …

接口详细说明

接口概述 接口也是一种规范 接口的定义与特点 接口的格式如下&#xff1a; //接口用关键字interface来定义 public interface 接口名 {// 常量// 抽象方法 } JDK8之前接口中只能是抽象方法和常量&#xff0c;没有其他成分了。 接口不能实例化。 接口中的成员都是public修…

svn介绍 4.0

一、svn介绍&#xff08;版本控制工具&#xff09; 1、svn的定义&#xff1a; svn是一个开放源代码的版本控制系统&#xff0c;通过采用分支管理系统的高效管理&#xff0c;简而言之就是用于多个人共同开发同一个项目&#xff0c;实现共享资源&#xff0c;实现最终集中式个管…