现代Web开发:Vue 3 组件化开发实战

news2024/11/14 14:57:45
💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

现代Web开发:Vue 3 组件化开发实战

现代Web开发:Vue 3 组件化开发实战

  • 现代Web开发:Vue 3 组件化开发实战
    • 引言
    • Vue 3 概述
      • 什么是 Vue 3
      • Vue 3 的特点
    • Vue 3 核心概念
      • Composition API
      • 响应式系统
      • 生命周期钩子
      • Teleport
      • Provide 和 Inject
    • 实战案例分析
      • 构建一个简单的待办事项应用
        • 项目结构
        • 安装依赖
        • 创建主组件
        • 创建待办事项列表组件
        • 启动应用
    • Vue 3 最佳实践
      • 严格模式
      • 按需加载
      • 代码分割
      • 缓存策略
      • 性能监控
    • 总结
    • 参考资料

引言

Vue 3 是 Vue.js 的最新版本,带来了许多新特性和性能优化,使得开发更加高效和灵活。本文将详细介绍 Vue 3 的基本概念、核心功能以及组件化开发的最佳实践,帮助读者更好地理解和使用这一强大工具。

Vue 3 概述

什么是 Vue 3

Vue 3 是一个渐进式 JavaScript 框架,用于构建用户界面。它具有轻量级、易学易用的特点,同时提供了丰富的功能和良好的性能。

Vue 3 的特点

  • Composition API:提供了一种更灵活、更强大的方式来组织和复用逻辑代码。
  • 更好的性能:通过 Proxy 对象实现了响应式系统的优化,提高了应用的性能。
  • TypeScript 支持:原生支持 TypeScript,提供了更好的类型检查和开发体验。
  • 更小的体积:通过 Tree Shaking 技术,减少了最终打包文件的大小。
  • 更好的工具链:提供了更强大的 CLI 工具和插件系统,简化了项目的搭建和维护。

Vue 3 核心概念

Composition API

Composition API 是 Vue 3 的一大亮点,它提供了一种更灵活的方式来组织和复用逻辑代码。

  • setup 函数:在组件的 setup 函数中,可以编写响应式数据、计算属性、方法等。
    <template>
      <div>{{ message }}</div>
    </template>
    
    <script>
    import { ref, computed } from 'vue';
    
    export default {
      setup() {
        const message = ref('Hello, Vue 3!');
    
        const reversedMessage = computed(() => {
          return message.value.split('').reverse().join('');
        });
    
        function changeMessage() {
          message.value = 'Vue 3 is awesome!';
        }
    
        return {
          message,
          reversedMessage,
          changeMessage,
        };
      },
    };
    </script>

响应式系统

Vue 3 通过 Proxy 对象实现了响应式系统的优化,提高了应用的性能。

  • ref 和 reactiveref 用于创建响应式的基本数据类型,reactive 用于创建响应式的对象。
    import { ref, reactive } from 'vue';
    
    const count = ref(0); // 基本数据类型
    const state = reactive({ count: 0 }); // 对象

生命周期钩子

Vue 3 的生命周期钩子与 Vue 2 类似,但在 Composition API 中,生命周期钩子的使用方式有所不同。

  • 生命周期钩子onMountedonUnmounted 等。
    import { onMounted, onUnmounted } from 'vue';
    
    export default {
      setup() {
        onMounted(() => {
          console.log('Component mounted');
        });
    
        onUnmounted(() => {
          console.log('Component unmounted');
        });
    
        return {};
      },
    };

Teleport

Teleport 允许我们将组件的内容渲染到 DOM 的任何位置,而不受组件层级的限制。

  • Teleport 示例:将模态框渲染到 <body> 标签中。
    <template>
      <teleport to="body">
        <div class="modal">
          <p>This is a modal dialog</p>
          <button @click="$emit('close')">Close</button>
        </div>
      </teleport>
    </template>
    
    <script>
    export default {
      emits: ['close'],
    };
    </script>
    
    <style>
    .modal {
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      background: white;
      padding: 20px;
      border: 1px solid #ccc;
    }
    </style>

Provide 和 Inject

Provide 和 Inject 用于在组件树中传递数据,避免了通过多层 prop 传递的麻烦。

  • Provide 和 Inject 示例:在父组件中提供数据,在子组件中注入数据。

    <!-- ParentComponent.vue -->
    <template>
      <child-component></child-component>
    </template>
    
    <script>
    import { provide } from 'vue';
    import ChildComponent from './ChildComponent.vue';
    
    export default {
      components: {
        ChildComponent,
      },
      setup() {
        provide('message', 'Hello from parent!');
    
        return {};
      },
    };
    </script>
    
    <!-- ChildComponent.vue -->
    <template>
      <div>{{ message }}</div>
    </template>
    
    <script>
    import { inject } from 'vue';
    
    export default {
      setup() {
        const message = inject('message');
    
        return {
          message,
        };
      },
    };
    </script>
    

实战案例分析

构建一个简单的待办事项应用

假设我们要构建一个简单的待办事项应用,包含添加、删除和标记完成功能。

项目结构
todo-app/
├── public/
├── src/
│   ├── assets/
│   ├── components/
│   │   └── TodoList.vue
│   ├── App.vue
│   ├── main.js
├── package.json
└── vite.config.js
安装依赖
npm init vite@latest todo-app --template vue
创建主组件

src/App.vue 中创建主组件。

<template>
  <div id="app">
    <h1>To-Do List</h1>
    <todo-list></todo-list>
  </div>
</template>

<script>
import TodoList from './components/TodoList.vue';

export default {
  name: 'App',
  components: {
    TodoList,
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
创建待办事项列表组件

src/components/TodoList.vue 中创建待办事项列表组件。

<template>
  <div>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a new to-do" />
    <ul>
      <li v-for="(todo, index) in todos" :key="index">
        <span :class="{ completed: todo.completed }" @click="toggleComplete(index)">{{ todo.text }}</span>
        <button @click="deleteTodo(index)">Delete</button>
      </li>
    </ul>
  </div>
</template>

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

export default {
  setup() {
    const newTodo = ref('');
    const todos = ref([]);

    function addTodo() {
      if (newTodo.value.trim() !== '') {
        todos.value.push({ text: newTodo.value, completed: false });
        newTodo.value = '';
      }
    }

    function deleteTodo(index) {
      todos.value.splice(index, 1);
    }

    function toggleComplete(index) {
      todos.value[index].completed = !todos.value[index].completed;
    }

    return {
      newTodo,
      todos,
      addTodo,
      deleteTodo,
      toggleComplete,
    };
  },
};
</script>

<style>
.completed {
  text-decoration: line-through;
  color: gray;
}
</style>
启动应用

运行以下命令启动应用。

npm run dev

打开浏览器访问 http://localhost:3000,可以看到待办事项应用已经成功运行。

Vue 3 最佳实践

严格模式

在生产环境中使用严格模式,可以提高构建性能和安全性。

// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    target: 'esnext',
  },
});

按需加载

通过动态导入实现按需加载,提高应用的加载速度。

<template>
  <div>
    <button @click="loadComponent">Load Component</button>
    <component v-if="loadedComponent" :is="loadedComponent"></component>
  </div>
</template>

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

export default {
  setup() {
    const loadedComponent = ref(null);

    const loadComponent = () => {
      import('./LazyComponent.vue').then((module) => {
        loadedComponent.value = module.default;
      });
    };

    return {
      loadedComponent,
      loadComponent,
    };
  },
};
</script>

代码分割

使用 defineAsyncComponent 进行代码分割,减少初始加载时间。

import { defineAsyncComponent } from 'vue';

const LazyComponent = defineAsyncComponent(() =>
  import('./LazyComponent.vue')
);

export default {
  components: {
    LazyComponent,
  },
};

缓存策略

通过 HTTP 缓存头和静态生成,提高应用的加载速度。

// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  server: {
    headers: {
      'Cache-Control': 'public, max-age=0, s-maxage=31536000',
    },
  },
});

性能监控

使用 vue-devtools 进行性能监控。

npm install -g vue-devtools

总结

通过本文,我们深入了解了 Vue 3 的基本概念、核心功能以及组件化开发的最佳实践。Vue 3 通过 Composition API、响应式系统优化、更好的 TypeScript 支持等特性,使得现代 Web 应用的开发更加高效和灵活。希望本文能帮助读者更好地理解和应用 Vue 3,提升Web开发能力。
Vue 3 组件结构图

参考资料

  • Vue 3 官方文档
  • Vue 3 深入解析
  • Vue 3 最佳实践

Vue 3 项目结构图

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

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

相关文章

VBA08-if语句

一、单行 If 语句 If x > 10 Then MsgBox "x is greater than 10"二、多行 If...Then...End If 语句 If x > 10 ThenMsgBox "x is greater than 10"y x 5 End If 三、If...Then...Else 语句 If condition Then 当条件为真时执行的代码块stateme…

深度学习中的感受野:从基础概念到多层次特征提取

在深度学习&#xff0c;特别是计算机视觉任务中&#xff0c;感受野&#xff08;Receptive Field&#xff09;是一个至关重要的概念。它指的是在神经网络中某一层的神经元在输入图像上“看到”的区域大小。感受野的大小影响了网络能捕捉的特征层级&#xff0c;从而决定了它的特征…

Jekins篇(搭建/安装/配置)

目录 一、环境准备 1. Jenkins安装和持续集成环境配置 2. 服务器列表 3. 安装环境 Jekins 环境 4. JDK 环境 5. Maven环境 6. Git环境 方法一&#xff1a;yum安装 二、JenKins 安装 1. JenKins 访问 2. jenkins 初始化配置 三、Jenkins 配置 1. 镜像配置 四、Mave…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

C++ : STL容器(适配器)之stack、queue剖析

STL容器适配器之stack、queue剖析 一、stack、queue的接口&#xff08;一&#xff09;stack 接口说明&#xff08;二&#xff09;queue 接口说明 二、stack、queue的模拟实现&#xff08;一&#xff09;stack、queue是容器适配器stack、queue底层默认容器--deque1、deque概念及…

排序算法.

排序算法是最常用的一种算法.它解决的主要问题是在一定的时间复杂度和空间复杂度的条件下,对n个数按照一定的顺序进行排序.排序算法主要分为四大类,即插入类,交换类,选择类和归并类,不同的排序算法的时间复杂程度和空间复杂程度差别很大. 排序算法主要有以下几种: 1.插入类排…

window下安装rust 及 vscode配置

安装 安装mingw64 &#xff08;c语言环境 选择posix-ucrt&#xff09; ucrt:通用c运行时库配置mingw64/bin的路径到环境变量中在cmd窗口中输入命令 "gcc -v" 4. 下载Rust安装程序 安装 Rust - Rust 程序设计语言 5. 配置rustup和cargo目录 &#xff08;cargo是包管…

contos7.9 部署3节点 hadoop3.4 集群 非高可用

contos7.9 部署3节点 hadoop3.4 集群 非高可用 contos7.9 部署3节点 hadoop3.4 集群 非高可用环境信息服务器角色分配服务器配置服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 配置免密登录 hadoop 安装环境配置下载安装包下载 jdk1.8hadoop3.4 分发安…

M1M2 MAC安装windows11 虚拟机的全过程

M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机&#xff0c;将途中遇到的坑总结一下。 1、虚拟机软件&#xff1a;vmware fusion 13.6 或者 parallel 19 &#xff1f; 结论是&#xff1a;用parellel 19。 这两个软件都安装过&#xff0…

【设计模式系列】享元模式(十五)

目录 一、什么是享元模式 二、享元模式的角色 三、享元模式的典型应用场景 四、享元模式在ThreadPoolExecutor中的应用 1. 享元对象&#xff08;Flyweight&#xff09;- 工作线程&#xff08;Worker&#xff09; 2. 享元工厂&#xff08;Flyweight Factory&#xff09;- …

国产化浪潮下,高科技企业如何选择合适的国产ftp软件方案?

高科技企业在数字化转型和创新发展中&#xff0c;数据资产扮演着越来越重要的角色。在研发过程中产生的实验数据、设计文档、测试结果等&#xff0c;专利、商标、版权之类的创新成果等&#xff0c;随着信息量急剧增加和安全威胁的复杂化&#xff0c;传统的FTP软件已经不能满足这…

大模型人工智能课程全栈完整学习路径

嘿&#xff0c;朋友们&#xff0c;今天我们聊点高级的——大模型人工智能课程的全栈学习路径。不过别慌&#xff0c;虽然听起来高大上&#xff0c;但咱们慢慢来。从零开始&#xff0c;一步步带你走进这个神奇的世界。喝杯咖啡&#xff0c;穿上最舒适的拖鞋&#xff0c;准备好踏…

【CUDA】认识CUDA

目录 一、CUDA编程 二、第一个CUDA程序 三、CUDA关键字 四、device管理 4.1 初始化 4.2 Runtime API查询GPU信息 4.3 决定最佳GPU CUDA C 编程指南CUDA C在线文档&#xff1a;CUDA C 编程指南 CUDA是并行计算的平台和类C编程模型&#xff0c;能很容易的实现并行算法。只…

吾店云介绍 – 中国人的WordPress独立站和商城系统平台

经过多年在WordPress建站领域的摸索和探索&#xff0c;能轻松创建和管理各种类型网站的平台 – 吾店云建站平台诞生了。 应该说这是一个艰苦卓绝的过程&#xff0c;在中国创建一个能轻松创建和使用WordPress网站的平台并不容易&#xff0c;最主要是网络环境和托管软件的限制。…

黔院长 | 慢病快调,中医养生的奇迹之旅!

想象一下&#xff0c;自己踏上了一场奇妙的冒险之旅&#xff0c;而目的地就是健康的彼岸。在这场旅途中&#xff0c;黔院长如同一位智慧的向导&#xff0c;引领我们穿越中医养生的神秘世界&#xff0c;实现慢病快调。 黔院长&#xff0c;这个拥有着古老传承的中医世家&#xff…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着医疗行业的快速发展和人们对健康需…

「撸一手好代码」设计模式之接口隔离原则

「撸一手好代码」设计模式之接口隔离原则 什么是接口隔离原则 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;指出&#xff0c;客户端不应该依赖它不使用的接口。换句话说&#xff0c;一个类对另一个类的依赖应该建立在最小的接口上。接口的设计应…

在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;数据绑定机制是其核心功能之一&#xff0c;广泛用于连接应用程序的UI&#xff08;用户界面&#xff09;和应用程序的业务逻辑层。数据绑定允许你将UI元素与数据源&#xff08;如对象、集合或其他数…

线性代数:Matrix2x2和Matrix3x3

今天整理自己的框架代码&#xff0c;将Matrix2x2和Matrix3x3给扩展了一下&#xff0c;发现网上unity数学计算相关挺少的&#xff0c;所以记录一下。 首先扩展Matrix2x2&#xff1a; using System.Collections; using System.Collections.Generic; using Unity.Mathemati…