首页 > 其他分享 >Vue3中的自定义事件和状态提升案例

Vue3中的自定义事件和状态提升案例

时间:2024-08-31 13:53:29浏览次数:15  
标签:CounterDisplay 状态 vue 自定义 计数 案例 Vue3 组件

Vue3中的自定义事件和状态提升案例

在现代Web开发中,Vue.js作为一个轻量级且灵活的前端框架,越来越受到开发者的青睐。而Vue3引入的组合式API(setup语法糖)更是让状态管理和事件处理变得更加优雅。在这篇博客中,我们将探讨如何在Vue3中利用自定义事件和状态提升,实现组件间的有效通信。

什么是自定义事件?

自定义事件是Vue组件与其他组件之间传递信息的一种方式。当子组件需要将一些信息传递给父组件时,可以通过自定义事件的形式实现。Vue允许我们使用 $emit 方法来触发自定义事件,从而实现数据的流动,确保组件之间的解耦。

状态提升(State Lifting)

状态提升是将状态从子组件移动到父组件的过程,以便多个子组件能够共享同一个状态。通过状态提升,我们可以将常见的状态放在共同的父组件中,这样可以让各个子组件都能访问和修改这个状态。

实现案例

我们将实现一个简单的计数器应用,包含一个父组件和两个子组件:一个子组件负责显示当前的计数值,另一个子组件负责增加计数。

1. 创建父组件

首先,我们需要创建一个父组件 CounterApp.vue。该组件将管理计数的状态,并将其传递给子组件。

<template>
  <div>
    <h1>计数器应用</h1>
    <CounterDisplay :count="count" />
    <CounterButton @increment="incrementCount" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import CounterDisplay from './CounterDisplay.vue';
import CounterButton from './CounterButton.vue';

const count = ref(0);

const incrementCount () => {
  count.value++;
};
</script>

<style scoped>
h1 {
  text-align: center;
}
</style>

2. 创建子组件 CounterDisplay.vue

该子组件接收父组件传来的 count 属性,并显示当前计数值。

<template>
  <div>
    <h2>当前计数: {{ count }}</h2>
 div>
</template>

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  count: {
    type: Number,
    required: true,
  },
script>

<style scoped>
h2 {
  text-align: center;
  color: #4caf50;
}
</style>

3. 创建子组件 CounterButton.vue

该子组件负责增加计数,通过自定义事件将请求传递给父组件。

<template>
  <div>
    <button @click="handleClick">增加计数</button>
  </div>
</template>

<script setup>
import { defineEmits } from 'vue';

const emit = defineEmits();

const handleClick = () => {
  emit('increment');
};
</script>

<style scoped>
button {
  padding: 10px 20px;
  font-size: 16px;
}
</style>

4. 整合组件

完成上述组件后,我们通过父组件将它们整合起来。CounterApp.vue 中的 CounterDisplay 组件通过 props 接收当前计数,而 CounterButton 通过自定义事件 increment 向父组件发送请求。

运行结果

在浏览器中运行该应用,我们可以看到:

  1. 初始的计数为 0。
  2. 每点击一次 “增加计数” 按钮,计数值便加一,并在 CounterDisplay 中实时更新显示。

小结

通过这个简单的例子,我们成功演示了如何在 Vue3 中使用自定义事件和状态提升。父组件 CounterApp 通过管理状态,使得两个子组件 CounterDisplayCounterButton 能够有效协作。

进一步的扩展

在实际项目中,你可能会遇到更复杂的组件结构。状态提升和自定义事件的模式在需要多个组件共享状态时十分有效,但在较大且复杂的项目中,状态管理库(如 Vuex 或 Pinia)可能会更合适。

同时,我们还可以通过组合多个子组件以实现更高级的功能。例如,不同的按钮可以实现不同的计数方式,或者增加对减法计数器的支持。通过这种方式,你可以充分利用 Vue3 的灵活性,创建出更复杂的用户交互界面。


最后问候亲爱的朋友们,并邀请你们阅读我的全新著作

书籍详情
在这里插入图片描述

标签:CounterDisplay,状态,vue,自定义,计数,案例,Vue3,组件
From: https://blog.csdn.net/yuanlong12178/article/details/141751823

相关文章

  • 在Vue3中实现懒加载功能
    在Vue3中实现懒加载功能在现代前端开发中,懒加载是一种提高应用性能和用户体验的重要技术,尤其是在处理较大图片或长列表数据时。懒加载意味着仅在用户需要时才加载资源,这有助于减少初始加载时间和提升响应速度。本文将使用Vue3和其新推出的setup语法糖来实现懒加载......
  • 高并发系统-使用自定义日志埋点快速排查问题
    背景在高并发的系统中,通常不会打印除参数校验失败或捕获异常之外的日志,防止对接口的性能产生影响。那对于请求不符合预期的情况,我们如何快速找到是哪块逻辑影响的至关重要。Pfinder提供的链路监控,更多的是性能层面的监控,无法满足我们上述的诉求。下面我将通过自定义通用上下文,添加......
  • 第七章 项目布局实现(7.4.7)——自定义主题
    7.4.7自定义主题==强烈建议:==在模板中不要配置与颜色有关的样式,否则自定义主题不生效很难排错。明亮模式新建src/styles/element/light.scss//onlyscssvariables$--colors:('primary':('base':green,),);@forward'element-plus/theme-ch......
  • 第七章 项目布局实现(7.4.5)——ElementPlus 自定义命名空间
    7.4.5ElementPlus自定义命名空间参考:https://cn.element-plus.org/zh-CN/guide/namespace.htmlElementPlus提供的默认命名空间为el。在特殊情况下,我们需要自定义命名空间。我们使用sass书写样式,必须同时设置ElConfigProvider和scss$namespace。设置ElC......
  • vue3 jsx响应式渲染变量
    1、JSX渲染变量vue在html代码区渲染变量使用双大括号{{}},jsx在渲染是单大括号{}另外,这里随便记一下一个简单有点绕的业务逻辑2、多个变量影响判断三元表达式根据上图,想要的效果分别是:订单状态是否支付,显示对应状态已支付的订单是否申请开发票,显示对应状态;且已申请的无法......
  • Ethercat设备数据 转IEC61850项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 25 设置网关采集ETHERCAT数据 56 用IEC61850协议转发数据 77 网关使用多个逻辑设备和逻辑节点的方法 98 安装NPCAP 109 案例总结 111 案例说明设置网关采集EtherCAT设备数据把采集的数据转成IEC61850协议转发给其他系......
  • Ethercat设备数据 转IEC61850项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 25 设置网关采集ETHERCAT数据 56 用IEC61850协议转发数据 77 网关使用多个逻辑设备和逻辑节点的方法 98 安装NPCAP 109 案例总结 111 案例说明设置网关采集EtherCAT设备数据把采集的数据转成IEC61850协议转发给其他......
  • vue3 导出为Excel文件
    服务端给的一个下载接口:/order/exportOrderOpenInvoice导出转化为ExcelconstexportOrder=async()=>{ letreqData={};  letexportOrderOpenInvoiceUrl="/order/exportOrderOpenInvoice";   try{   constresponse=awaitaxios.get(exportOrderOpenInvo......
  • vue3+ts封装一个uniapp的自动滚动列表,实现看板效果
    电视机上要以列表展示数据,并且数据会实时更新,电视机不能点击,所以考虑自动播放的一个效果。展示方案有两种:1、列表上下自动滚动实现轮播效果。(此时具体滚动的高度由用户自己决定,每次滚动几条数据)2、列表以“页”的形式做成轮播图的翻页效果。由于项目的电视机是有任务提示作......
  • Go 语言生产服务故障案例精析
            大多数Go开发者都停留在简单的增删改查层面,对Go语言本身掌握程度不够,对常用依赖或者开源组件掌握不够,在开发项目过程中总会不经意间引入一些千奇百怪的问题,并且在遇到线上问题时往往束手无策。下面列举一些线上问题以及相应的解决思路,希望大家能从这些问题......