【SOLID原则前端中的应用】里氏替换原则(Liskov Substitution Principle,LSP)- vue3示例

里氏替换原则(Liskov Substitution Principle,LSP)规定,子类对象必须能够替换父类对象,并且程序的行为保持不变。
在Vue 3中,这意味着我们在创建可替换的组件时,应该确保子组件能够完全替代父组件,而不会引发错误或不一致的行为。


在这里插入图片描述

示例:EmailInput 组件

1. 创建基本输入组件 BaseInput.vue

这个组件是一个基本的输入框组件,可以接受任何类型的输入。

<!-- BaseInput.vue -->
<template>
    <div class="base-input">
      <label :for="id">{{ label }}</label>
      <input :id="id" :type="type" v-model="internalValue" />
    </div>
  </template>
  
  <script>
  export default {
    name: 'BaseInput',
    props: {
      id: {
        type: String,
        required: true
      },
      label: {
        type: String,
        required: true
      },
      type: {
        type: String,
        default: 'text'
      },
      modelValue: {
        type: [String, Number],
        default: ''
      }
    },
    computed: {
      internalValue: {
        get() {
          return this.modelValue;
        },
        set(value) {
          this.$emit('update:modelValue', value);
        }
      }
    }
  };
  </script>
  
  <style scoped>
  .base-input {
    margin-bottom: 10px;
  }
  label {
    display: block;
    margin-bottom: 5px;
  }
  input {
    width: 100%;
    padding: 8px;
    border: 1px solid #ccc;
    border-radius: 4px;
  }
  </style>
2. 创建电子邮件输入组件 EmailInput.vue

这个组件扩展了 BaseInput,添加了电子邮件格式验证和错误提示功能。

<!-- EmailInput.vue -->
<template>
    <div class="email-input">
      <BaseInput 
        :id="id" 
        :label="label" 
        type="email" 
        v-model="emailValue" 
        @update:modelValue="validateEmail"
      />
      <p v-if="error" class="error">{{ error }}</p>
    </div>
  </template>
  
  <script>
  import BaseInput from './BaseInput.vue';
  
  export default {
    name: 'EmailInput',
    components: {
      BaseInput
    },
    props: {
      id: {
        type: String,
        required: true
      },
      label: {
        type: String,
        required: true
      },
      modelValue: {
        type: String,
        default: ''
      }
    },
    data() {
      return {
        emailValue: this.modelValue,
        error: ''
      };
    },
    watch: {
      emailValue(newValue) {
        this.$emit('update:modelValue', newValue);
        this.validateEmail();
      }
    },
    methods: {
      validateEmail() {
        const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        if (!emailPattern.test(this.emailValue)) {
          this.error = '无效的邮箱地址';
        } else {
          this.error = '';
        }
      }
    }
  };
  </script>
  
  <style scoped>
  .email-input {
    margin-bottom: 10px;
  }
  .error {
    color: red;
    font-size: 0.875em;
  }
  </style>
3. 使用组件

在父组件中无缝替换 BaseInputEmailInput

<!-- App.vue -->
<template>
  <div id="app">
    <!-- 使用BaseInput -->
    <BaseInput id="username" label="Username" v-model="username" placeholder="请输入用户名" />

    <!-- 使用EmailInput替换BaseInput -->
     <br>
    <EmailInput id="email" label="Email" v-model="email"  placeholder="邮箱地址" />
  </div>
</template>

<script>
import BaseInput from './components/BaseInput.vue';
import EmailInput from './components/EmailInput.vue';

export default {
  name: 'App',
  components: {
    BaseInput,
    EmailInput
  },
  data() {
    return {
      username: '',
      email: ''
    };
  }
};
</script>

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

总结

上面的示例中,首先创建了一个通用输入组件 BaseInput,它可以接受任何类型的输入。
然后,创建了一个电子邮件输入组件 EmailInput,通过扩展 BaseInput 来专门处理电子邮件输入,并增加了电子邮件格式验证和错误提示功能。

EmailInput 继承了 BaseInput 的所有属性和方法,同时增加了对电子邮件格式的验证。
如果输入的电子邮件格式不正确,会显示错误提示信息。
这样,我们可以在需要电子邮件输入的地方无缝替换 BaseInputEmailInput,而不需要修改其他代码。

通过这种方式,我们遵循了里氏替换原则,确保子组件能够替代父组件而不改变程序的行为。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杭州叉车A38老款国二 车辆维修与保养

发动机参数 更换缸垫 故障表现特征&#xff1a; 1. 发动机发动风扇端有异响&#xff0c;喷气 2. 水箱加水后外冒有水气泡 车型&#xff1a; 新柴490B 预估市场平均价格&#xff1a; 25一个 发动机-气门间隙调整 气门间隙大小&#xff1a; 经询问相关师傅&#xff0c;此次调整…

物联网综合实验平台-物联网实验实训教学平台-物联网实验箱

物联网&#xff08;IoT&#xff09;是一种连接性技术&#xff0c;将各种设备和物品连接到互联网&#xff0c;通过数据的收集和分析实现更智能的决策和操作。在《“十四五”数字经济发展规划》中&#xff0c;物联网被明确提出&#xff0c;被视为数字经济时代的基础设施。当前&am…

【JavaWeb】利用IntelliJ IDEA 2024.1.4 +Tomcat10 搭建Java Web项目开发环境(图文超详细)

1、启动IntelliJ idea 2024.1.4 在欢迎页面&#xff0c;请确认好版本。因为不同的版本&#xff0c;搭建项目过程不太一样。 点击&#xff0c;新建项目。如图&#xff1a; 2、新建项目 在新建项目界面&#xff0c;选择java&#xff0c;在右侧信息模块内&#xff0c;根据个人情…

C语言中函数的声明和创建

C语言的函数创建和java函数有有一定的区别&#xff1a;如下示例&#xff1a; fun.h文件 fun.c文件 main.c文件 或这简单一点可以这样写&#xff0c; 声明和定义的差异&#xff1a; 函数分类

加速度传感器信号处理注意事项

1 传感器分类 对于压电式压力传感器而言&#xff0c;输出信号是最重要的选择标准之一。压电式压力传感器与电子电路相连&#xff0c;电子电路将传感器产生的电荷成比例转换为电压。 如果选用外部设备&#xff08;电荷放大器&#xff09;充当电子元件&#xff0c;则称其为电…

线程池概念的详解

前言&#x1f440;~ 上一章我们介绍了什么是定时器以及如何去实现一个定时器&#xff0c;今天我们来讲解在多线程中同样很重要的一个内容线程池 线程池的出现 线程池概念 标准库中的线程池 工厂模式 newCacheThreadPool方法 newFixedThreadPool方法 ThreadPoolExecutor…

2024年广东省食品安全管理员考试精选练习题库。

16.食品流通可的单次有效期为&#xff08;&#xff09;年。 A.2 B.3 C.5 答案&#xff1a;B 17.无公害农产品的标志是&#xff08;&#xff09;的。 A.绿颜色 B.绿橙两色 答案&#xff1a;B 18.与食品安全有关的"危险温度带"是指适合大多数致病菌增殖的温度…

基于贝叶斯优化的卷积神经网络-循环神经网络混合模型的的模拟股票时间序列预测(MATLAB R2021B)

将机器学习和深度学习方法运用到股市分析中, 不仅具有一定的理论价值, 也具有一定的实践价值。从理论价值上讲, 中国的量化投资技术&#xff08;投资观念、方法与决策等&#xff09;还不够成熟, 尚处在起步阶段, 能够将量化投资技术运用到投资决策中的公司寥寥无几。目前, 国内…

初识单片机

单片机 英文 Micro Controller Unit&#xff08;MCU&#xff09; 1.内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 2.单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处理&#xff08;依靠CPU&#xff09;和硬件设备&#…

pycharm无法添加python解释器的解决方法

出现该错误的原因是先前创建过重名的解释器&#xff08;虚拟环境&#xff09;&#xff0c;在pycharm配置中没有完全删除干净。解决方法如下&#xff1a; 首先在文件->设置界面&#xff0c;找到解释器设置。 然后先按图所示点击全部显示虚拟环境&#xff1a; 接着将无法添…

HTTP基本原理与爬虫

文章目录 HTTP基本原理与爬虫客户端-服务器模型请求和响应示例请求&#xff1a;示例响应&#xff1a; 无状态协议HTTP方法HTTP状态码HTTP/2 和 HTTP/3 HTTP在爬虫中的应用 HTTP基本原理与爬虫 客户端-服务器模型 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文…

基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型

背景 随着城市化进程的加速和房地产市场的快速发展&#xff0c;房价已成为经济学、社会学等多学科交叉研究的热点问题。为了更精确地分析和预测房价&#xff0c;数据分析和机器学习技术被广泛应用。在此背景下&#xff0c;开发一个基于Python Django的房价数据分析平台具有重要…

KVB交易平台 :市场迎来新热潮!铜价会持续上涨吗?

近期&#xff0c;全球铜价出现明显上涨趋势。韩国光阳LME仓库的铜库存显著下降&#xff0c;市场对即时需求的增加作出了积极反应。供应端的紧张和需求端的复苏共同推动了铜价的上涨。 KVB外汇 分析师们对未来铜价保持谨慎乐观态度&#xff0c;认为长期内铜价有望保持稳定甚至进…

单元测试总结,一文全通

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、何为单测 测试有黑盒测试和白盒测试之分&#xff0c;黑盒测试顾名思义就是我们不了解盒子的…

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列 1.相关链接2.代码【仅分析带通信算子的Pattern】3.在实际工程中发现 [all_gather, matrix_mm_out]频率最高4.[Ascend MC2](https://gitee.com/ascend/MindSpeed/blob/master/docs/features…

微软关闭中国所有线下店,并不影响全球第一

​关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 微软没有被时代淘汰&#xff0c;时代也没有告别微软!中国市场对微软可有可无&#xff0c;即便没有中国市场&#xff0c;微软市值也在全球前三&#xff0c;这是事实!a 5月中旬&#xff0c;微软azure解散中国分部…

【C语言入门】初识C语言:掌握编程的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C语言入门 &#x1f4d2;1. 选择…

LLMs之gptpdf:gptpdf的简介、安装和使用方法、案例应用之详细攻略

LLMs之gptpdf&#xff1a;gptpdf的简介、安装和使用方法、案例应用之详细攻略 目录 gptpdf的简介 1、处理流程 第一步&#xff0c;使用 PyMuPDF 库&#xff0c;对 PDF 进行解析出所有非文本区域&#xff0c;并做好标记&#xff0c;比如: 第二步&#xff0c;使用视觉大模型&…

错误 [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 python ping

报错提示&#xff1a;错误 [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 用python做了一个批量ping脚本&#xff0c;在windows专业版上没问题&#xff0c;但是到了windows服务器就出现这个报错 解决方法&#xff1a;右键 管理员身份运行 这个脚本 …

使用 PCA 可视化数据的分类能力

使用 PCA 探索数据分类的效果&#xff08;使用 Python 代码&#xff09; 「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 主成分分析 (PCA) 是数据科学家使用的绝佳工具。它可用于降低特征…