Vue 3 完整应用开发与扩展教程

server/2024/10/21 10:11:39/

目录

  • Vue 3 完整应用开发与扩展教程
    • 前言
    • 1. 综合项目开发
      • 1.1 选定项目
      • 1.2 项目初始化
      • 1.3 结构设计
      • 1.4 组件开发
        • 1.4.1 ArticleList.vue
        • 1.4.2 ArticleItem.vue
        • 1.4.3 ArticleEditor.vue
      • 1.5 路由配置
      • 1.6 状态管理
      • 1.7 表单处理
    • 2. 服务端渲染(SSR)与 Nuxt.js
      • 2.1 Nuxt.js 介绍
      • 2.2 创建 Nuxt 应用
      • 2.3 目录结构
      • 2.4 页面创建与数据获取
      • 2.5 路由定义
      • 2.6 SSR 优势
    • 3. 测试
      • 3.1 单元测试
        • 3.1.1 安装依赖
        • 3.1.2 编写测试
      • 3.2 端到端测试
        • 3.2.1 安装 Cypress
        • 3.2.2 编写测试
    • 4. TypeScript 与 Vue
      • 4.1 在 Vue 中使用 TypeScript
      • 4.2 类型系统与组件结合
    • 5. 参与社区与开源
      • 5.1 加入 Vue.js 社区
      • 5.2 开源贡献
      • 5.3 学习资源
    • 结论

Vue 3 完整应用开发与扩展教程

前言

在前几阶段中,我们学习了 Vue 3 的基础知识,包括组件创建、状态管理和路由使用等。现在我们将进入一个新的阶段,深入探讨如何将这些知识应用于实际项目,以及如何扩展我们的技能。本文将指导你创建一个完整的应用(例如个人博客、Todo List 或电商平台),并涵盖服务端渲染(SSR)、测试、TypeScript、参与社区与开源等内容。

1. 综合项目开发

1.1 选定项目

我们将以 个人博客 为例,创建一个完整的应用。项目需求包括:

  • 用户可以查看文章列表和单篇文章
  • 用户可以添加、编辑和删除自己的文章
  • 用户可以注册和登录
  • 文章的评论功能

1.2 项目初始化

使用 Vue CLI 快速创建项目。

vue create my-blog
cd my-blog

选择 Vue 3 并适当配置路由、Vuex(状态管理)和其他需要的插件。

1.3 结构设计

项目结构设计:

src/
├── assets/
├── components/
│   ├── ArticleList.vue
│   ├── ArticleItem.vue
│   └── ArticleEditor.vue
├── pages/
│   ├── Home.vue
│   ├── Login.vue
│   ├── Register.vue
│   ├── Article.vue
│   └── NotFound.vue
├── router/
│   └── index.js
├── store/
│   ├── index.js
│   └── modules/
│       └── articles.js
├── App.vue
└── main.js

1.4 组件开发

1.4.1 ArticleList.vue

展示文章列表的组件。

<template><div><h1>文章列表</h1><ul><ArticleItem v-for="article in articles" :key="article.id" :article="article" /></ul></div>
</template><script>
import ArticleItem from '../components/ArticleItem.vue';
import { mapState } from 'vuex';export default {components: {ArticleItem,},computed: {...mapState('articles', ['articles']),},created() {this.$store.dispatch('articles/fetchArticles');},
};
</script>
1.4.2 ArticleItem.vue

展示单篇文章的组件。

<template><li><router-link :to="{ name: 'article', params: { id: article.id } }">{{ article.title }}</router-link></li>
</template><script>
export default {props: {article: {type: Object,required: true,},},
};
</script>
1.4.3 ArticleEditor.vue

添加和编辑文章的组件。

<template><div><h1>{{ isEditing ? '编辑文章' : '新建文章' }}</h1><form @submit.prevent="submitArticle"><input v-model="article.title" placeholder="标题" /><textarea v-model="article.content" placeholder="内容"></textarea><button type="submit">{{ isEditing ? '保存' : '发布' }}</button></form></div>
</template><script>
import { mapActions } from 'vuex';export default {props: {isEditing: {type: Boolean,default: false,},article: {type: Object,default: () => ({ title: '', content: '' }),},},data() {return {article: { ...this.article },};},methods: {...mapActions('articles', ['createArticle', 'updateArticle']),async submitArticle() {if (this.isEditing) {await this.updateArticle(this.article);} else {await this.createArticle(this.article);}this.$router.push({ name: 'home' });},},
};
</script>

1.5 路由配置

src/router/index.js 中配置路由。

javascript">import { createRouter, createWebHistory } from 'vue-router';
import Home from '../pages/Home.vue';
import Login from '../pages/Login.vue';
import Register from '../pages/Register.vue';
import Article from '../pages/Article.vue';
import NotFound from '../pages/NotFound.vue';const routes = [{ path: '/', name: 'home', component: Home },{ path: '/login', name: 'login', component: Login },{ path: '/register', name: 'register', component: Register },{ path: '/article/:id', name: 'article', component: Article },{ path: '/:catchAll(.*)', name: 'not-found', component: NotFound },
];const router = createRouter({history: createWebHistory(),routes,
});export default router;

1.6 状态管理

src/store/modules/articles.js 中管理文章数据。

javascript">import axios from 'axios';const state = {articles: [],
};const mutations = {setArticles(state, articles) {state.articles = articles;},
};const actions = {async fetchArticles({ commit }) {const response = await axios.get('/api/articles');commit('setArticles', response.data);},async createArticle({ dispatch }, article) {await axios.post('/api/articles', article);dispatch('fetchArticles');},async updateArticle({ dispatch }, article) {await axios.put(`/api/articles/${article.id}`, article);dispatch('fetchArticles');},
};const getters = {articles: (state) => state.articles,
};export default {namespaced: true,state,mutations,actions,getters,
};

1.7 表单处理

在表单中处理用户输入和验证。

  • 使用 v-model 进行数据绑定。
  • 实现基本的输入验证和提示。

2. 服务端渲染(SSR)与 Nuxt.js

2.1 Nuxt.js 介绍

Nuxt.js 是一个基于 Vue.js 的框架,用于构建服务端渲染 (SSR) 应用程序。它可以帮助你轻松地实现路由、状态管理和服务端请求等功能。

2.2 创建 Nuxt 应用

使用以下命令创建一个新的 Nuxt 应用:

npx create-nuxt-app my-nuxt-blog

在初始化的时候选择适合自己需求的模块,例如 axios、vuex 等。

2.3 目录结构

Nuxt.js 的项目结构如下:

my-nuxt-blog/
├── assets/
├── components/
├── layouts/
├── pages/
├── plugins/
├── store/
├── nuxt.config.js
└── package.json

2.4 页面创建与数据获取

pages/index.vue 中创建主页,并获取文章数据。

<template><div><h1>文章列表</h1><ul><li v-for="article in articles" :key="article.id"><nuxt-link :to="'/article/' + article.id">{{ article.title }}</nuxt-link></li></ul></div>
</template><script>
export default {async asyncData({ $axios }) {const { data } = await $axios.get('/api/articles');return { articles: data };},
};
</script>

2.5 路由定义

Nuxt.js 会自动通过 pages 目录生成路由,确保文件名符合路由规则。

2.6 SSR 优势

SSR 有助于提高搜索引擎优化(SEO)和首屏加载速度,使内容在服务端预渲染,客户浏览器得到完整的 HTML 页面。

3. 测试

3.1 单元测试

使用 Vue Test Utils 和 Jest 为 Vue 组件编写单元测试。

3.1.1 安装依赖
npm install --save-dev @vue/test-utils jest
3.1.2 编写测试

tests/unit 目录下创建测试文件,并编写测试用例。

javascript">import { mount } from '@vue/test-utils';
import ArticleItem from '@/components/ArticleItem.vue';describe('ArticleItem.vue', () => {it('renders article title', () => {const article = { id: 1, title: 'Test Article' };const wrapper = mount(ArticleItem, {props: { article },});expect(wrapper.text()).toContain('Test Article');});
});

3.2 端到端测试

使用 Cypress 实现端到端测试。

3.2.1 安装 Cypress
npm install --save-dev cypress
3.2.2 编写测试

cypress/integration 目录下创建测试文件。

javascript">describe('My Blog', () => {it('loads the home page', () => {cy.visit('/');cy.contains('文章列表');});
});

4. TypeScript 与 Vue

4.1 在 Vue 中使用 TypeScript

如果你想要在 Vue 3 中使用 TypeScript,可以在初始化项目时选择 TypeScript 选项。之后,可以在组件中添加类型注解。

javascript"><script lang="ts">
import { defineComponent } from 'vue';export default defineComponent({props: {msg: {type: String,required: true,},},
});
</script>

4.2 类型系统与组件结合

使用 TypeScript 可以提供更好的类型安全和代码提示。你可以为状态、属性和事件定义类型,确保在开发阶段能及时发现潜在错误。

5. 参与社区与开源

5.1 加入 Vue.js 社区

参与 Vue 的相关论坛和社交媒体,如 Vue 论坛、Stack Overflow、Twitter 和 Discord,向他人学习并发布你的项目。

5.2 开源贡献

寻找 Vue.js 相关的开源项目,先从文档改进、Bug 修复开始,逐步深入 code review 和 feature 贡献。

5.3 学习资源

  • Vue.js 官方文档:提供详尽的使用和开发教程。
  • Nuxt.js 文档:深入了解 Nuxt.js 的使用方式和高级功能。
  • 社区博客和视频:跟踪最新的开发动态。

结论

通过本文,我们创建了一个完整的 Vue 3 应用,实现了服务端渲染、测试与 TypeScript 的基本使用。同时,我们也了解到参与社区和开源的重要性。希望你能将这些知识运用到自己的项目中,不断提升自己的技能!


http://www.ppmy.cn/server/95385.html

相关文章

学习笔记——交通安全分析17

目录 前言 学习笔记整理 6城郊主干道交通安全分析 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 #本期内容接上一期16笔记 学习笔记整理 6城郊主干道交通安全分析 …

在 Manim 中,line_func函数的介绍

在 Manim 中&#xff0c;line_func 参数可以使用多种线条类来绘制线条。以下是一些常用的线条类&#xff0c;您可以根据需要选择使用&#xff1a; Line: 最基本的线条类&#xff0c;用于绘制直线。 DashedLine: 绘制虚线的线条类。 Arrow: 带箭头的线条&#xff0c;非常适合表示…

Django中的超级管理员相关操作

超级管理员操作 场景描述添加超级管理员删除超级管理员更改超级管理员名称 场景描述 在进行管理员操作的时候&#xff0c;密码忘记&#xff0c;导致超级管理员无法使用&#xff0c;因此网上搜索相关操作&#xff0c;进行总结记录 相关操作都是在控制台完成 Terminal 添加超级管…

electron-builder打包vue2项目问题合集

一、打包之后不显示elecmentui的图标 1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在v…

XML 学习笔记

简介&#xff1a; &#xff08;1&#xff09;XML&#xff1a;可扩展性标记语言&#xff0c;用于传输和存储数据&#xff0c;而不是展示数据&#xff0c;是W3C 推举的数据传输格式。 XML的标签必须自定义&#xff0c;但是在写标签名的时候一定要有含义。 XML 只能有一个根节点…

什么是人工智能 (AI)

1955年9月&#xff0c;达特茅斯学院&#xff08;Dartmouth College&#xff09;年轻的数学助理教授约翰麦卡锡&#xff08;John McCarthy&#xff09;大胆提出&#xff0c;“原则上&#xff0c;学习的各个方面或智力的任何其他特征都可以被精确地描述&#xff0c;以至于可以制造…

嵌入式linux相机 图像处理模块

V4L2接口捕获图像数据&#xff0c;OpenCV简单图像处理 OpenCV提供了大量的图像处理功能&#xff0c;包括滤波、边缘检测、几何变换 #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> #include <sys/…

[Git][分支管理][上]详细讲解

目录 1.理解分支2.创建分支3.切换分支4.合并分支5.删除分支 1.理解分支 感性理解&#xff1a;分支可以理解为平行宇宙&#xff0c;但是在用户需要的时候&#xff0c;可以将两个平行宇宙合并&#xff0c;此时两个平行宇宙的效果将会"叠加"理性理解&#xff1a;每次提…