【SOLID原则前端中的应用】接口隔离原则(Interface Segregation Principle,ISP)- vue3示例

news2024/12/23 15:45:27

接口隔离原则(Interface Segregation Principle,ISP)在Vue 3中的应用

接口隔离原则(Interface Segregation Principle,ISP)规定,客户端不应该被迫依赖于它不使用的方法。
换句话说,我们应该避免创建包含过多职责的“胖接口”,而应该创建细粒度的接口,使得每个接口只包含客户端实际需要的方法。

在Vue 3中,这可以通过将组件的职责分解成更小的、功能单一的组件来实现。
下面的示例,展示如何在Vue 3中应用接口隔离原则。

示例场景:用户信息展示和编辑

在这里插入图片描述

假设有一个组件,需要展示和编辑用户信息。
按照接口隔离原则,将这个需求分解成两个独立的组件:一个负责展示用户信息(UserDisplay.vue),另一个负责编辑用户信息(UserEdit.vue)。
这样,每个组件只包含与其职责相关的方法和属性。

1. 用户信息展示组件 UserDisplay.vue

这个组件只负责展示用户的信息。

<!-- UserDisplay.vue -->
<template>
    <div class="user-display">
      <h2>{{ user.name }}</h2>
      <p>{{ user.email }}</p>
    </div>
  </template>
  
  <script>
  export default {
    name: 'UserDisplay',
    props: {
      user: {
        type: Object,
        required: true
      }
    }
  };
  </script>
  
  <style scoped>
  .user-display {
    border: 1px solid #ccc;
    padding: 10px;
    border-radius: 5px;
  }
  </style>
2. 用户信息编辑组件 UserEdit.vue

这个组件只负责编辑用户的信息。

<!-- UserEdit.vue -->
<template>
    <div class="user-edit">
      <label for="name">Name:</label>
      <input id="name" v-model="localUser.name" />
      <label for="email">Email:</label>
      <input id="email" v-model="localUser.email" />
      <button @click="saveUser">Save</button>
    </div>
  </template>
  
  <script>
  import { ref, watch, toRefs } from 'vue';
  
  export default {
    name: 'UserEdit',
    props: {
      user: {
        type: Object,
        required: true
      }
    },
    setup(props, { emit }) {
      const { user } = toRefs(props);
      const localUser = ref({ ...user.value });
  
      watch(user, (newUser) => {
        localUser.value = { ...newUser };
      }, { deep: true });
  
      const saveUser = () => {
        emit('save', localUser.value);
      };
  
      return {
        localUser,
        saveUser
      };
    }
  };
  </script>
  
  <style scoped>
  .user-edit {
    display: flex;
    flex-direction: column;
    gap: 10px;
  }
  label {
    margin-bottom: 5px;
  }
  input {
    padding: 8px;
    border: 1px solid #ccc;
    border-radius: 4px;
  }
  button {
    padding: 10px;
    border: none;
    border-radius: 4px;
    background-color: #007bff;
    color: white;
    cursor: pointer;
  }
  </style>
3. 使用组件

在父组件中组合使用 UserDisplayUserEdit 组件。

<!-- App.vue -->
<template>
  <div id="app">
    <UserDisplay :user="user" />
    <UserEdit :user="user" @save="handleSave" />
  </div>
</template>

<script>
import { ref } from 'vue';
import UserDisplay from './components/UserDisplay.vue';
import UserEdit from './components/UserEdit.vue';

export default {
  name: 'App',
  components: {
    UserDisplay,
    UserEdit
  },
  setup() {
    const user = ref({
      name: 'John Doe',
      email: 'john.doe@example.com'
    });

    const handleSave = (updatedUser) => {
      user.value = updatedUser;
    };

    return {
      user,
      handleSave
    };
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

解释

在示例中,我用户信息展示和编辑的职责分解成两个独立的组件:

  1. UserDisplay.vue:这个组件只负责展示用户的信息,不包含任何编辑逻辑。
  2. UserEdit.vue:这个组件只负责编辑用户的信息,并包含保存逻辑。

通过这种方式,确保每个组件都有明确的职责,避免创建包含过多职责的“胖组件”。
这样做不仅使组件更加简洁、易于理解和测试,还可以在需要时更容易地对组件进行重用和维护。

在父组件 App.vue 中,我们组合使用了 UserDisplayUserEdit 组件,分别负责展示和编辑用户信息。这种方式遵循了接口隔离原则,使得每个组件只依赖于它实际需要的方法和属性。

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

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

相关文章

【Python】已解决:SyntaxError: positional argument follows keyword argument

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SyntaxError: positional argument follows keyword argument 一、分析问题背景 在Python编程中&#xff0c;当我们在调用函数时混合使用位置参数&#xff08;p…

运维必会 掌握 Vim:从入门到精通

前言 Vim 是一个强大的文本编辑器&#xff0c;以其高效的编辑操作和强大的可定制性著称。无论你是编程新手还是经验丰富的开发者&#xff0c;Vim 都能帮助你提高工作效率。本文将带你深入了解 Vim&#xff0c;从基本操作到高级配置&#xff0c;逐步掌握。 一、基本操作 1. 模…

电力设备巡检管理系统

电力设备巡检管理系统是一种基于计算机技术和网络通信技术的智能化管理系统&#xff0c;旨在提高电力设备巡检的效率、准确性和安全性。以下是对该系统的详细介绍&#xff1a; 一、系统概述 电力设备巡检管理系统通过实时采集、传输和分析电力设备的数据&#xff0c;帮助电力企…

项目方案:社会视频资源整合接入汇聚系统解决方案(九)-视频监控汇聚应用案例

目录 一、概述 1.1 应用背景 1.2 总体目标 1.3 设计原则 1.4 设计依据 1.5 术语解释 二、需求分析 2.1 政策分析 2.2 业务分析 2.3 系统需求 三、系统总体设计 3.1设计思路 3.2总体架构 3.3联网技术要求 四、视频整合及汇聚接入 4.1设计概述 4.2社会视频资源分…

Docassemble interview 未授权任意文件读取漏洞复现(CVE-2024-27292)

0x01 产品简介 Docassemble是一款强大的开源工具,主要用于自动化生成和定制复杂文档,特别是在法律文档处理领域表现出色。由Jonathan Pyle个人开发者开发,是一个免费的开源专家系统,用于指导访谈和文档组装。Docassemble基于Python编写,充分利用了Python的灵活性和广泛的…

【无标题】地平线2西之绝境/Horizon Forbidden West™ Complete Edition(更新:V1.3.57)

游戏介绍 与埃洛伊同行&#xff0c;在危险壮美的边疆之地揭开种种未知的神秘威胁。此完整版可完整享受广受好评的《地平线 西之绝境™》内容和额外内容&#xff0c;包括在主线游戏后展开的后续故事“炙炎海岸”。 重返《地平线》中遥远未来的后末日世界&#xff0c;探索远方的土…

解密智慧校园基础数据的学年管理功能

在智慧校园平台中&#xff0c;学年管理模块构成了教育活动有序运行的基石&#xff0c;它精心设计来适应多样化的学术日程&#xff0c;确保学校的各项事务都能在清晰规划的学年框架内顺利推进。这一核心功能不仅关乎时间的界定&#xff0c;更深层次地融入了教育管理的每一个细微…

记录在Windows上安装Docker

在Windows上安装Docker时&#xff0c;可以选择使用不同的后端。 其中两个常见的选择是&#xff1a;WSL 2&#xff08;Windows Subsystem for Linux 2&#xff09;和 Hyper-V 后端。此外&#xff0c;还可以选择使用Windows容器。 三者的区别了解即可&#xff0c;推荐用WSL 2&…

一、redis-万字长文读懂redis

高性能分布式缓存Redis `第一篇章`1.1缓存发展史&缓存分类1.1.1 大型网站中缓存的使用带来的问题1.1.2 常见缓存的分类及对比与memcache对比1.2 数据类型选择&应用场景1.2.1 string1.2.2 hash1.2.3 链表1.2.4 set1.2.5 sortedset有序集合类型1.2.6 总结1.3 Redis高级应…

AI集成工具平台一站式体验,零门槛使用国内外主流大模型

目录 0 写在前面1 AI艺术大师1.1 绘画制图1.2 智能作曲 2 AI科研助理2.1 学术搜索2.2 自动代码 3 AI智能对话3.1 聊天机器人3.2 模型竞技场 4 特别福利 0 写在前面 人工智能大模型浪潮滚滚&#xff0c;正推动着千行百业的数智化进程。随着技术演进&#xff0c;2024年被视为是大…

『C++成长记』string模拟实现

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 &#x1f4d2;2.1构造函数 &#x1f4d2;2.…

C语言调试技巧

叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.bug 是什么2.debug 是什么3.两种模式的区别4.IDE 调试介绍4.1.模…

满足信创环境运行的国产FTP服务器是什么样的?

2018 年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期&#xff0c;中国明确 “数字中国”建设战略&#xff0c; 抢占数字经济产业链制高点。 在…

RK3588编译rkmpp,拉取海康威视网络摄像头264码流并运行yolo

硬件&#xff1a;EVB评估版 SOC&#xff1a;Rockchip RK3588 背景&#xff1a; 由于项目需要&#xff0c;需要拉取264码流&#xff0c;并通过将yolov5s.pt将模型转化为rknn模型&#xff0c;获取模型分析结果。取流可以通过软件解码或者硬件解码&#xff0c;硬件解码速度更快&…

tesseract-ocr 字库训练(提高识别率进阶版)

github字库地址&#xff1a;https://github.com/tesseract-ocr/tessdata 一、tesseract-ocr字库训练 1、配置 jdk 环境变量 步骤&#xff08;略&#xff09; 2、安装 tesseract-ocr 并配置环境变量 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 配置环境…

无人机群辅助边缘计算系统的任务卸载和资源分配联合优化

源自&#xff1a;系统工程与电子技术 作者&#xff1a;刘世豪 黄仰超 胡航 司江勃 韩蕙竹 安琪 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 为提升无人机群辅助边缘计算系统在负载不均衡场景下的性能, 构…

红黑树模拟实现

概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&#xff0c;因而是接近平衡…

使用GZip对npm run build打包的vendor.js文件进行压缩

vue-cli项目 安装npm i compression-webpack-plugin -D npm i compression-webpack-plugin -D使用&#xff1a;在vue.config.js文件中 const CompressionPlugin require(compression-webpack-plugin) module.exports {configureWebpack: {plugins: [new CompressionPlugin…

html+css+js贪吃蛇游戏

贪吃蛇游戏&#x1f579;四个按钮控制方向&#x1f3ae; 源代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 互粉必回&#x1f64f;&#x1f64f;&#x1f60d;&#x1f60d;&#x1f60d; 源代码&#x1f4df; <!DOCTYPE html> <html lang"en"&…

【2024最新】Arduino通过Python进行串口通信控制电机

1. 背景 最近想研究一下用 Python 控制 Arduino 的技术&#xff0c;通过上网查询&#xff0c;发现可以用 Python 中的 serial 库来实现和 Arduino 主板的串口通信&#xff0c;从而控制 Arduino。 特此记录一下这个小项目的过程及出现的问题。 2. 基础准备 主板&#xff1a;…