如何学习Vue设计模式

如何学习Vue设计模式

Vue 设计模式是 Vue.js 框架中用于解决常见问题的可复用解决方案。这些模式帮助开发者更有效地组织和管理代码,提升代码的可维护性、可扩展性和可读性。以下是一些常见的 Vue 设计模式:

1. 数据存储模式

可组合函数:用于创建可共享的数据存储,包含全局状态、单例导出部分或全部状态用于访问和修改状态的方法

<script setup lang="ts">
import { reactive, toRefs, readonly } from 'vue';
import { themes } from './utils';// 1. 在模块作用域中创建全局状态,在每次使用此可组合函数时共享
const state = reactive({darkMode: false,sidebarCollapsed: false,// 2. 此主题值对该可组合函数保持私有theme: 'nord',
});export default () => {// 2. 仅暴露部分状态// 使用 toRefs 允许我们共享单个值const { darkMode, sidebarCollapsed } = toRefs(state);// 3. 修改我们的基础状态const changeTheme = (newTheme) => {if (themes.includes(newTheme)) {// 仅在它是一个有效主题时更新state.theme = newTheme;}};return {// 2. 只返回部分状态darkMode,sidebarCollapsed,// 2. 仅暴露状态的只读版本theme: readonly(state.theme),// 3. 我们返回一个修改基础状态的方法changeTheme,};
};
</script>

2. 轻量级可组合函数

将反应式管理与核心业务逻辑分离,使用纯 JavaScript 或 TypeScript 实现业务逻辑,并在其上添加一层轻量级的反应式。

<script setup lang="ts">import { ref, watch } from 'vue';import { convertToFahrenheit } from './temperatureConversion';export function useTemperatureConverter(celsiusRef: Ref<number>) {const fahrenheit = ref(0);watch(celsiusRef, (newCelsius) => {// 实际逻辑包含在一个纯函数中fahrenheit.value = convertToFahrenheit(newCelsius);});return { fahrenheit };}
</script>

3. 谦逊组件模式

谦逊组件的设计理念是简单,专注于展示和用户输入,将业务逻辑放在其他地方,遵循“属性向下,事件向上”的原则,确保数据流清晰、可预测,使其易于重用、测试和维护。

<template><div class="max-w-sm rounded overflow-hidden shadow-lg"><img class="w-full" :src="userData.image" alt="User Image" /><div class="px-6 py-4"><div class="font-bold text-xl mb-2">{{ userData.name }}</div><p class="text-gray-700 text-base">{{ userData.bio }}</p></div><div class="px-6 pt-4 pb-2"><button@click="emitEditProfile"class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Edit Profile</button></div></div>
</template><script setup>
defineProps({userData: Object,
});const emitEditProfile = () => {emit('edit-profile');
};
</script>

4. 提取条件逻辑

为了简化包含多个条件分支的模板,我们将每个分支的内容提取到单独的组件中。这可以提高代码的可读性和可维护性。

<!-- 之前 --><template><div v-if="condition"><!-- 真实条件下的大量代码 --></div><div v-else><!-- 假设条件下的大量代码 --></div>
</template><!-- 之后 --><template><TrueConditionComponent v-if="condition" /><FalseConditionComponent v-else />
</template>

5. 提取可组合函数

将逻辑提取到可组合函数中,即使是单次使用的场景也是如此。可组合函数可以简化组件,使其更容易理解和维护。

它们还有助于添加相关方法和状态,例如撤销和重做功能。这有助于我们将逻辑与 UI 分开。

<script setup lang="ts">
import { ref, watch } from 'vue';export function useExampleLogic(initialValue: number) {const count = ref(initialValue);const increment = () => {count.value++;};const decrement = () => {count.value--;};watch(count, (newValue, oldValue) => {console.log(`Count changed from ${oldValue} to ${newValue}`);});return { count, increment, decrement };
}
</script>

<template><div class="flex flex-col items-center justify-center"><button@click="decrement"class="bg-blue-500 text-white p-2 rounded">Decrement</button><p class="text-lg my-4">Count: {{ count }}</p><button@click="increment"class="bg-green-500 text-white p-2 rounded">Increment</button></div>
</template><script setup lang="ts">
import { useExampleLogic } from './useExampleLogic';const { count, increment, decrement } = useExampleLogic(0);
</script>

6. 列表组件模式

组件中的大型列表会导致模板混乱和难以管理。解决方案是将 v-for 循环逻辑抽象到一个子组件中。

这可以简化父组件,并将迭代逻辑封装在专门的列表组件中,保持整洁。

<!-- 之前:在父组件中直接使用 v-for --><template><div v-for="item in list" :key="item.id"><!-- 每个项目的代码 --></div>
</template><!-- 之后:将 v-for 抽象到子组件中 --><template><NewComponentList :list="list" />
</template>

7. 保留对象模式

将整个对象传递给组件,而不是单个属性,可以简化组件并使其更具未来可扩展性。

然而,这种方法可能会造成对对象结构的依赖,因此不太适合通用组件。

<!-- 使用整个对象 --><template><CustomerDisplay :customer="activeCustomer" />
</template><!-- CustomerDisplay.vue --><template><div><p>Name: {{ customer.name }}</p><p>Age: {{ customer.age }}</p><p>Address: {{ customer.address }}</p></div>
</template>

8. 控制器组件

Vue 中的控制器组件弥合了 UI(谦逊组件)和业务逻辑(可组合函数)之间的差距。

它们管理状态和交互,协调应用程序的整体行为。

<!-- TaskController.vue -->
<script setup>
import useTasks from './composables/useTasks';// 可组合函数包含业务逻辑
const { tasks, addTask, removeTask } = useTasks();
</script><template><!-- 谦逊组件提供 UI --><TaskInput @add-task="addTask" /><TaskList :tasks="tasks" @remove-task="removeTask" />
</template>

9. 策略模式

策略模式非常适合处理 Vue 应用程序中复杂的条件逻辑。它允许根据运行时条件在不同组件之间动态切换,从而提高代码的可读性和灵活性。在 Vue 的路由系统中,使用策略模式处理不同的导航行为,例如重定向、别名等。

<template><component :is="currentComponent" />
</template><script setup>
import { computed } from 'vue';
import ComponentOne from './ComponentOne.vue';
import ComponentTwo from './ComponentTwo.vue';
import ComponentThree from './ComponentThree.vue';const props = defineProps({conditionType: String,
});const currentComponent = computed(() => {switch (props.conditionType) {case 'one':return ComponentOne;case 'two':return ComponentTwo;case 'three':return ComponentThree;default:return DefaultComponent;}
});
</script>

10. 隐藏组件模式

隐藏组件模式涉及根据组件的使用方式,将复杂组件拆分成更小、更专注的组件。

如果不同的属性集是独占地一起使用的,则表明可以将组件进行拆分。

<!-- 重构之前 --><template><!-- 实际上是一个“图表”组件 --><DataDisplay:chart-data="data":chart-options="chartOptions"/><!-- 实际上是一个“表格”组件 --><DataDisplay:table-data="data":table-settings="tableSettings"/>
</template><!-- 重构之后 --><template><Chart :data="data" :options="chartOptions" /><table :data="data" :settings="tableSettings" />
</template>

11. 内部交易模式

内部交易模式解决了 Vue 中父组件和子组件过度耦合的问题。通过在必要时将子组件内联到父组件中,我们可以进行简化。

这个过程可以使组件结构更加连贯,减少碎片化。

<!-- ParentComponent.vue --><template><div><!-- 这个组件使用来自父组件的所有内容。它起什么作用呢? --><ChildComponent:user-name="userName":email-address="emailAddress":phone-number="phoneNumber"@user-update="(val) => $emit('user-update', val)"@email-update="(val) => $emit('email-update', val)"@phone-update="(val) => $emit('phone-update', val)"/></div>
</template><script setup>
defineProps({userName: String,emailAddress: String,phoneNumber: String,
});defineEmits(['user-update', 'email-update', 'phone-update']);
</script>

12. 长组件模式

什么算作“过长”的组件?

当它变得难以理解时。

长组件原则鼓励创建自文档化、命名清晰的组件,提高代码质量和可理解性。

<!-- 之前:一个冗长且复杂的组件 -->
<template><div><!-- 大量 HTML 和逻辑 --></div>
</template><!-- 之后:分解成更小的组件,名称告诉你代码的作用。 -->
<template><ComponentPartOne /><ComponentPartTwo />
</template>

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

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

相关文章

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布

当地时间1月7日&#xff0c;2025年国际消费电子展&#xff08;CES 2025&#xff09;在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓&#xff08;Ultra Magnus&#xff09;。该人形机器人内置美格智能基于高通QC…

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…

Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓

查找、绘制轮廓、圆形矩形轮廓和近似轮廓 目录 查找、绘制轮廓、圆形矩形轮廓和近似轮廓1 轮廓查找和绘制1.1 轮廓查找1.1.1 函数和参数1.1.2 返回值 1.2 轮廓绘制1.2.1 函数和参数 1.3 步骤1.4 实际测试绘制轮廓 2 绘制近似轮廓2.1 函数和参数2.2 查找特定轮廓2.3 近似轮廓测试…

【Linux】模拟Shell命令行解释器

一、知识补充 1.1 snprintf snprintf() 是 C语言的一个标准库函数&#xff0c;定义在<stdio.h>头文件中。 snprintf() 函数的功能是格式化字符串&#xff0c;并将结果存储在指定的字符数组中。该函数的原型如下&#xff1a; int snprintf(char *str, size_t size, con…

云计算基础,虚拟化原理

文章目录 一、虚拟化1.1 什么是虚拟化1.2 虚拟化类型 二 、存储虚拟化2.1 存储指标2.2 存储类型2.3 存储协议2.4 RAID 三、内存 i/O虚拟化3.1 内存虚拟化基本概念地址空间转换原理内存共享与隔离原理 3.2 I/O 虚拟化基本概念模拟&#xff08;Emulation&#xff09;方式半虚拟化…

Vue3 + Vite + Electron + Ts 项目快速创建

一、创建 Vue 项目 1. 创建项目 pnpm create vite 2. 安装依赖 cd excel-electron pnpm install 3. 运行项目 pnpm dev 二、添加 Electron 1. 安装 electron pnpm add electron -D 2. 修改 package.json 添加入口 js 和执行命令。 {"main": "dist-ele…

pytest+allure 入门

使用allure如何生成自动化测试报​​​​​​告 &#xff1f;一文详解allure的使用 。_allure测试报告-CSDN博客 例子&#xff1a; import allure import pytest import osallure.epic("闹钟") allure.feature("闹钟增删") class TestSchedule():def setu…

新活动平台建设历程与架构演进

01 前言 历时近两年的重新设计和迭代重构&#xff0c;用户技术中心的新活动平台建设bilibili活动中台终于落地完成&#xff01;并迎来了里程碑时刻 —— 接过新老迭代的历史交接棒&#xff0c;从内到外、从开发到搭建实现全面升级&#xff0c;开启了活动生产工业化新时代&#…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言&#xff1a; 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream&#xff0c;许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下&#xff0c;龙蜥操作系统&#xff08;OpenAnolis&#xff09;作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

MR实战:IP地址去重

文章目录 1. 实战概述2. 提出任务2.1 原始问题2.2 简单化处理 3. 准备数据3.1 在云主机上创建文本文件3.2 上传文件到HDFS指定目录 4. 实现步骤4.1 创建Maven项目4.2 添加相关依赖4.3 创建日志属性文件4.4 创建网址去重映射器类4.5 创建网址去重归并器类4.6 创建网址去重驱动器…

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢&#xff0c;改为pip下载 复制下载链接到迅雷下载 激活虚拟环境&#xff0c;安装whl&#xff0c;即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片&#xff0c;从而节省时间和精力&#xff0c;提高工作效率。批处理功能特别适用于需要批量处理的任务&#xff0c;如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

Web渗透测试之XSS跨站脚本 防御[WAF]绕过手法

目录 XSS防御绕过汇总 参考这篇文章绕过 XSS payload XSS防御绕过汇总 服务端知道有网络攻击或者xss攻 Html 通过js代码 标签属性等手段进行一个过滤 不允许出现css的payload 前端过滤 我可以在抓包工具里面修改 抓包工具是不受前端的防御 也 就是浏览器 服务端过滤…

git提交

基本流程&#xff1a;新建分支 → 分支上开发(写代码) → 提交 → 合并到主分支 拉取最新代码因为当前在 master 分支下&#xff0c;你必须拉取最新代码&#xff0c;保证当前代码与线上同步&#xff08;最新&#xff09;&#xff0c;执行以下命令&#xff1a;bashgit pull orig…

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…

【Git原理和使用】Git 分支管理(创建、切换、合并、删除、bug分支)

一、理解分支 我们可以把分支理解为一个分身&#xff0c;这个分身是与我们的主身是相互独立的&#xff0c;比如我们的主身在这个月学C&#xff0c;而分身在这个月学java&#xff0c;在一个月以后我们让分身与主身融合&#xff0c;这样主身在一个月内既学会了C&#xff0c;也学…

静态路由配置与调试——计算机网络实训day1

文章目录 操作前准备一、实验目的二、实验要求三、实验过程1、在R1和R2上配置设备名称。基本配置设备命名 2、在R1和R2上配置接口IP地址&#xff0c;并查看IP地址的配置情况。3、在R1和R2上配置静态路由&#xff0c;并查看路由表。静态路由缺省路由&#xff08;默认路由&#x…

农产品直播带货方案拆解

作为一名经验丰富的营销策划人道叔&#xff0c;今天我来拆解一下咱们4A营销广告圈的这份《直播天府川农好物带货方案》&#xff0c;让你能学到很多实用的策略和技巧&#xff0c;直接应用到你的策划工作中去。 首先&#xff0c;咱们看看背景分析。 助农直播现在可是个大热门&a…

【Qt】控件概述和QWidget核心属性1(enabled、geometry、windowTitle、windowIcon、QRC机制)

一、控件概念 界面上各种元素、各种部分的统称&#xff08;如按钮、输入框、下拉框、单选复选框...&#xff09; Qt作为GUI开发框架&#xff0c;内置了各种的常用控件&#xff0c;并支持自定义控件。 二、控件体系发展 1.没有完全的控件&#xff0c;需要使用绘图API手动绘制…