vue3组件化开发优势劣势分析,及一个案例

news2025/1/8 14:41:03

Vue 3 组件化开发的优势和劣势

优势

可复用性:

组件可以重复使用,减少代码冗余,提高开发效率。

可以在不同的项目中复用组件,提升开发速度。

可维护性:

组件化开发使得代码结构清晰,易于维护。

每个组件独立,修改一个组件不会影响其他组件。

模块化:

组件化开发符合模块化编程思想,便于团队协作。

每个组件可以独立开发和测试,提高开发效率。

灵活性:

Vue 3 提供了 Composition API 和 script setup 语法,使得逻辑组织和复用更加灵活。

可以根据需求选择 Options API 或 Composition API。

性能优化:

Vue 3 的响应式系统和虚拟 DOM 优化了性能,组件化开发可以更好地利用这些优化。

劣势

学习曲线:

对于新手来说,理解组件化开发和 Vue 3 的新特性(如 Composition API 和 script setup)可能需要一些时间。

复杂性:

在大型项目中,组件数量可能会非常多,管理这些组件和它们之间的通信可能会变得复杂。

过度抽象:

如果过度使用组件化,可能会导致代码过于抽象,增加理解和维护的难度。

案例:使用 script setup 实现一个简单的 TodoList

项目结构

src/
│
├── components/
│   ├── TodoList.vue
│   ├── TodoItem.vue
│   └── AddTodo.vue
│
├── App.vue
└── main.js
1. TodoItem.vue - 单个任务项组件
<template>
  <li>
    <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
    <button @click="toggleComplete">Toggle</button>
    <button @click="deleteTodo">Delete</button>
  </li>
</template>

<script setup>
const props = defineProps({
  todo: {
    type: Object,
    required: true,
  },
});

const emit = defineEmits(['toggle-complete', 'delete-todo']);

const toggleComplete = () => {
  emit('toggle-complete', props.todo.id);
};

const deleteTodo = () => {
  emit('delete-todo', props.todo.id);
};
</script>

<style scoped>
li {
  list-style: none;
  margin: 10px 0;
}

button {
  margin-left: 10px;
}

.completed {
  text-decoration: line-through;
  color: gray;
}
</style>
2. TodoList.vue - 任务列表组件
<template>
  <ul>
    <TodoItem
      v-for="todo in todos"
      :key="todo.id"
      :todo="todo"
      @toggle-complete="handleToggleComplete"
      @delete-todo="handleDeleteTodo"
    />
  </ul>
</template>

<script setup>
import TodoItem from './TodoItem.vue';

const props = defineProps({
  todos: {
    type: Array,
    required: true,
  },
});

const emit = defineEmits(['toggle-complete', 'delete-todo']);

const handleToggleComplete = (todoId) => {
  emit('toggle-complete', todoId);
};

const handleDeleteTodo = (todoId) => {
  emit('delete-todo', todoId);
};
</script>

<style scoped>
ul {
  padding: 0;
}
</style>
3. AddTodo.vue - 添加任务组件
<template>
  <div>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a new task" />
    <button @click="addTodo">Add</button>
  </div>
</template>

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

const newTodo = ref('');

const emit = defineEmits(['add-todo']);

const addTodo = () => {
  if (newTodo.value.trim()) {
    emit('add-todo', newTodo.value);
    newTodo.value = '';
  }
};
</script>

<style scoped>
input {
  margin-right: 10px;
}
</style>
4. App.vue - 主组件
<template>
  <div id="app">
    <h1>Todo List</h1>
    <AddTodo @add-todo="handleAddTodo" />
    <TodoList :todos="todos" @toggle-complete="handleToggleComplete" @delete-todo="handleDeleteTodo" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import AddTodo from './components/AddTodo.vue';
import TodoList from './components/TodoList.vue';

const todos = ref([
  { id: 1, text: 'Learn Vue 3', completed: false },
  { id: 2, text: 'Build a project', completed: false },
]);

const handleAddTodo = (newTodoText) => {
  todos.value.push({
    id: todos.value.length + 1,
    text: newTodoText,
    completed: false,
  });
};

const handleToggleComplete = (todoId) => {
  const todo = todos.value.find((t) => t.id === todoId);
  if (todo) {
    todo.completed = !todo.completed;
  }
};

const handleDeleteTodo = (todoId) => {
  todos.value = todos.value.filter((t) => t.id !== todoId);
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
5. main.js - 入口文件
import { createApp } from 'vue';
import App from './App.vue';

createApp(App).mount('#app');
运行项目

在项目根目录下运行以下命令来启动开发服务器:

npm run serve

总结

使用 script setup 语法更简洁地编写 Vue 3 组件,减少样板代码。

组件化开发使得代码结构清晰,易于维护和扩展。

这个案例展示了如何使用 Vue 3 的响应式系统和组件化开发模式构建一个功能完整的 TodoList 应用。

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

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

相关文章

php反序列化原生态 ctfshow练习 字符串逃逸

web262 拿着题审计一下 <?php error_reporting(0); class message{public $from;public $msg;public $to;public $tokenuser;public function __construct($f,$m,$t){$this->from $f;$this->msg $m;$this->to $t;} }$f $_GET[f]; $m $_GET[m]; $t $_GET[t…

探秘前沿科技:RFID 与 NFC,开启智能识别新篇

RFID&#xff08;射频识别&#xff09;与NFC&#xff08;近场通信&#xff09;作为两种基于射频技术的无线通信方式&#xff0c;在现代社会中发挥着越来越重要的作用。尽管它们都具备非接触式识别和通信的能力&#xff0c;但在工作原理、应用场景、技术细节等方面存在着显著的差…

【04】优雅草央千澈详解关于APP签名以及分发-上架完整流程-第四篇安卓APP上架之vivo商店-小米商店,oppo商店,应用宝

【04】优雅草央千澈详解关于APP签名以及分发-上架完整流程-第四篇安卓APP上架之vivo商店-小米商店&#xff0c;oppo商店&#xff0c;应用宝 背景介绍 接第三篇上架华为&#xff0c;由于华为商店较为细致&#xff0c;本篇幅介绍其他4类商店相对简要一点&#xff0c;剩下其他更…

OpenCV计算机视觉 06 图像轮廓检测(轮廓的查找、绘制、特征、近似及轮廓的最小外接圆外接矩形)

目录 图像轮廓检测 轮廓的查找 轮廓的绘制 轮廓的特征 面积 周长 根据面积显示特定轮廓 轮廓的近似 给定轮廓的最小外接圆、外接矩形 外接圆 外接矩形 图像轮廓检测 轮廓的查找 API函数 image, contours, hierarchy cv2.findContours(img, mode, method) 代入参…

ROS2 跨机话题通信问题(同一个校园网账号)

文章目录 写在前面的话校园网模式&#xff08;失败&#xff09;手机热点模式&#xff08;成功&#xff09; 我的实验细节实验验证1、ssh 用户名IP地址 终端控制2、互相 ping 通 IP3、ros2 run turtlesim turtlesim_node/turtle_teleop_key4、ros2 multicast send/receive5、从机…

web3与AI结合-Sahara AI 项目介绍

背景介绍 Sahara AI 于 2023 年创立&#xff0c;是一个 "区块链AI" 领域的项目。其项目愿景是&#xff0c;利用区块链和隐私技术将现有的 AI 商业模式去中心化&#xff0c;打造公平、透明、低门槛的 “协作 AI 经济” 体系&#xff0c;旨在重构新的利益分配机制以及…

【C++】你了解异常的用法吗?

文章目录 Ⅰ. C语言传统的处理错误的方式Ⅱ. C异常概念Ⅲ. 异常的使用1、异常的抛出和匹配原则2、在函数调用链中异常栈展开匹配原则3、异常的重新抛出4、异常安全5、异常规范 Ⅳ. 自定义异常体系Ⅴ. C标准库的异常体系Ⅵ. 异常的优缺点1、异常的优点2、异常的缺点3、总结 Ⅰ. …

Matlab仿真径向受压圆盘光弹图像

Matlab仿真径向受压圆盘光弹图像-十步相移法 主要参数 % 定义圆盘参数 R 15; % 圆盘半径&#xff0c;单位&#xff1a;mm h 5; % 圆盘厚度&#xff0c;单位&#xff1a;mm P 300; % 径向受压载荷大小&#xff0c;单位&#xff…

游戏引擎学习第75天

仓库:https://gitee.com/mrxiao_com/2d_game_2 Blackboard: 处理楼梯通行 为了实现楼梯的平滑过渡和角色的移动控制&#xff0c;需要对楼梯区域的碰撞与玩家的运动方式进行优化。具体的处理方式和遇到的问题如下&#xff1a; 楼梯区域的过渡&#xff1a; 在三维空间中&#x…

算法的学习笔记—不用常规控制语句求 1 到 n 的和

&#x1f600;前言 在算法编程中&#xff0c;有时我们会遇到一些特殊的限制条件&#xff0c;这些限制会迫使我们跳出常规思维。本文讨论的问题就是一个典型案例&#xff1a;在不能使用基本控制语句的情况下&#xff0c;如何求解 1 到 n 的和。这个问题不仅考验编程技巧&#xf…

网络协议安全的攻击手法

1.使用SYN Flood泛洪攻击&#xff1a; SYN Flood(半开放攻击)是最经典的ddos攻击之一&#xff0c;他利用了TCP协议的三次握手机制&#xff0c;攻击者通常利用工具或控制僵尸主机向服务器发送海量的变源端口的TCP SYN报文&#xff0c;服务器响应了这些报文后就会生成大量的半连…

141.《mac m1安装mongodb详细教程》

文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…

C++ operator = 返回void 会发生什么?

1.operator 正常情况 #include <iostream> using namespace std;class Box { public:Box(double L) : length(L) {}Box(const Box& b){}Box& operator (const Box&){return *this;}public:double length; // 长度 };int main() {Box box1(1.0);Box box2(…

Redis中字符串和列表的区别

在 Redis 中&#xff0c;字符串&#xff08;String&#xff09;和列表&#xff08;List&#xff09;是两种截然不同的数据类型&#xff0c;它们各自有着独特的特点和适用场景。 数据结构 • 字符串&#xff08;String&#xff09;&#xff1a; • 在 Redis 中&#xff0c;字符串…

Elasticsearch JavaRestClient版

文章目录 初始化RestHighLeveClient&#xff08;必要条件&#xff09;索引库操作1.创建索引库&#xff08;4步&#xff09;2.删除索引库&#xff08;3步&#xff09;3.判断索引库是否存在&#xff08;3步&#xff09;4.总结&#xff1a;四步走 文档操作1.创建文档&#xff08;4…

使用Dinky快速提交Flink operator任务

官网地址&#xff1a;K8s集成 | Dinky 1.目前使用版本 Dinky1.2.0、Flink1.18.1、Flink operator0.10.0 2.制作镜像 2.1创建DockerFile ARG FLINK_VERSION1.18.1 FROM flink:${FLINK_VERSION}-scala_2.12 RUN mkdir -p /opt/flink/usrlib COPY commons-cli-1.3.1.jar …

探索数字化展馆:开启科技与文化的奇幻之旅

在科技飞速发展的当下&#xff0c;数字展馆作为一种新兴的展示形式&#xff0c;正逐渐走进大众的视野。数字展馆不仅仅是传统展馆的简单“数字化升级”&#xff0c;更是融合了多媒体、数字化技术以及人机交互等前沿科技的创新产物。 数字展馆借助VR、AR、全息投影等高科技手段&…

免费GEMINI模型使用及API调用

一、概述 谷歌最新发布的Gemini 2.0 FLASH模型为AI应用带来了新的可能性。该模型分为两个版本&#xff1a;gemini-2.0-flash-exp 和 gemini-2.0-flash-thinking-exp-1219。这两个模型目前限时免费使用&#xff0c;用户可以通过智匠MindCraft客户端或小程序直接体验&#xff0c;…

调整Python+Pytest+Allure+Yaml+Pymysql框架中需要执行的用例顺序

当pytest框架中有时时候会因为用例的前后关联关系需要调整用例执行顺序时则可以跟进具体的要求调整pytest.ini配置文件中执行用例文件夹的前后顺序 当如果是需要调整某个文件夹中用例的执行顺序时&#xff0c;则跟进具体的文件调整对应testcases中test_*.py文件中的执行顺序

容器技术思想 Docker K8S

容器技术介绍 以Docker为代表的容器技术解决了程序部署运行方面的问题。在容器技术出现前&#xff0c;程序直接部署在物理服务器上&#xff0c;依赖管理复杂&#xff0c;包括各类运行依赖&#xff0c;且易变&#xff0c;多程序混合部署时还可能产生依赖冲突&#xff0c;给程序…