Vue 3 30天精进之旅:Day 29 - 项目实战

在学习了近一个月的Vue 3知识后,今天是我们学习旅程的第29天。在这一天,我们将专注于实践,通过一个小型项目来巩固之前的学习成果,并为之后的展示做好准备。

一、项目目标

我们将构建一个简单的个人博客应用,具备以下基本功能:

  1. 文章列表展示:从伪API获取文章数据并在页面上展示。
  2. 文章详情查看:用户可以点击文章标题,查看文章的详细内容。
  3. 文章创建:允许用户通过表单创建新文章并添加到文章列表中。
  4. 简单的路由导航:使用Vue Router实现页面间的导航。

二、项目准备

在开始我们的小型博客项目之前,确保你已经做好以下准备工作,以便顺利进行项目开发。以下是我们需要完成的几步准备工作:

1. 环境搭建

首先,确保你的开发环境已经搭建好。你需要安装以下工具和依赖:

  • Node.js:Vue.js依赖Node.js作为运行环境。请确保你安装了Node.js的LTS(长期支持)版本,可以在Node.js官网下载并安装。
  • npm或yarn:npm是Node.js自带的包管理工具,而yarn是一个更快的替代品。无论你选择哪一个,都可以用来安装项目依赖。

安装完成后,可以通过以下命令检查版本,确保它们已正确安装:

node -v
npm -v
# 或者,如果你使用yarn
yarn -v

2. 创建Vue项目

接下来,我们将使用Vue CLI快速生成一个新的Vue项目。如果你还没有安装Vue CLI,可以通过以下命令全局安装:

npm install -g @vue/cli
# 或者使用yarn
yarn global add @vue/cli

安装完成后,使用以下命令创建一个新的项目:

vue create my-blog

在创建过程中,Vue CLI会提示你选择预设。你可以选择“Default (Vue 3)”选项,或者根据个人需求手动选择要安装的功能(如路由、状态管理等)。

3. 安装依赖

创建项目后,进入项目目录并安装我们需要的依赖。我们将使用Vue Router处理路由,并使用axios进行HTTP请求。可以通过以下命令安装它们:

cd my-blog
npm install vue-router axios
# 或者使用yarn
yarn add vue-router axios

4. 理解项目结构

在项目创建完成后,查看项目的文件结构。一个典型的Vue项目结构如下所示:

my-blog/
├── node_modules/      # 项目依赖的第三方库
├── public/            # 存放静态文件
│   └── index.html     # 入口HTML文件
├── src/               # 源代码目录
│   ├── assets/        # 静态资源(如图片、样式等)
│   ├── components/    # Vue组件
│   ├── views/         # 视图组件
│   ├── router/        # 路由配置
│   ├── App.vue        # 主应用组件
│   └── main.js        # 项目入口文件
├── .gitignore         # Git忽略文件
├── package.json       # 项目依赖和配置
└── README.md          # 项目的说明文档
  • src/:这是我们主要的开发目录,所有的源代码文件都存放在这里。我们将在此目录下创建组件和视图文件。
  • components/:存放可复用的Vue组件。
  • views/:存放页面级的组件,通常对应路由中的视图。
  • router/:存放路由配置文件。

了解项目结构后,你会更清晰地知道在哪里添加新功能和组件。

5. 设置基本样式

虽然我们的项目主要关注功能实现,但基本的样式也能为用户提供更好的体验。你可以选择使用CSS框架(如Bootstrap、Tailwind CSS等)来加速样式开发。以下是安装Bootstrap的步骤:

npm install bootstrap

然后在你的src/main.js中引入Bootstrap样式:

import 'bootstrap/dist/css/bootstrap.min.css';

现在,你的项目就有了基础的样式支持。

6. 了解API

在我们的博客应用中,我们将使用一个伪API来获取和提交文章数据。可以使用JSONPlaceholder作为模拟的RESTful API。它提供了免费的虚拟数据接口,适合用于开发和测试。

了解API的基本用法后,可以尝试用Postman等工具测试API,熟悉请求和响应的格式。这将帮助你在项目中更顺利地进行数据交互。

7. 规划项目功能

在开始编码之前,先明确项目的功能需求和界面布局。这可以通过绘制草图或使用工具(如Figma、Sketch等)进行原型设计。我们将在项目中实现以下基本功能:

  • 文章列表:展示所有文章的标题和简短内容,用户可以点击查看详细信息。
  • 文章详情:展示点击的文章的完整内容。
  • 创建文章:用户可以通过表单提交新文章,添加到文章列表中。
  • 路由导航:实现不同页面间的导航。

明确了功能需求后,你可以开始逐步实现这些功能。

通过上述准备工作,你将为即将到来的项目开发奠定坚实的基础。接下来,我们将进入实际的编码阶段,开始实现博客应用的具体功能。准备好了吗?让我们开始吧!

三、项目结构

创建一个新的Vue项目并按照以下结构组织你的代码:

src/
├── components/
│   ├── ArticleList.vue
│   ├── ArticleDetail.vue
│   └── ArticleForm.vue
├── views/
│   ├── Home.vue
│   └── ArticleView.vue
├── router/
│   └── index.js
└── App.vue

四、代码实现

1. 设置路由

src/router/index.js中设置路由:

import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import ArticleView from '../views/ArticleView.vue';const routes = [{ path: '/', component: Home },{ path: '/article/:id', component: ArticleView, props: true },
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes,
});export default router;

2. 创建文章列表组件

src/components/ArticleList.vue中实现文章列表展示:

<template><div><h1>文章列表</h1><ul><li v-for="article in articles" :key="article.id"><router-link :to="`/article/${article.id}`">{{ article.title }}</router-link></li></ul><ArticleForm @article-added="fetchArticles" /></div>
</template><script>
import axios from 'axios';
import ArticleForm from './ArticleForm.vue';export default {components: { ArticleForm },data() {return {articles: [],};},methods: {async fetchArticles() {const response = await axios.get('https://jsonplaceholder.typicode.com/posts');this.articles = response.data;},},mounted() {this.fetchArticles();},
};
</script>

3. 创建文章详情组件

src/components/ArticleDetail.vue中实现文章详情展示:

<template><div><h1>{{ article.title }}</h1><p>{{ article.body }}</p><router-link to="/">返回文章列表</router-link></div>
</template><script>
import axios from 'axios';export default {props: ['id'],data() {return {article: {},};},async mounted() {const response = await axios.get(`https://jsonplaceholder.typicode.com/posts/${this.id}`);this.article = response.data;},
};
</script>

4. 创建文章创建表单组件

src/components/ArticleForm.vue中实现文章创建表单:

<template><form @submit.prevent="submitForm"><input v-model="title" placeholder="文章标题" required /><textarea v-model="body" placeholder="文章内容" required></textarea><button type="submit">创建文章</button></form>
</template><script>
export default {data() {return {title: '',body: '',};},methods: {submitForm() {const newArticle = {id: Date.now(), // 简单生成 IDtitle: this.title,body: this.body,};this.$emit('article-added', newArticle); // 向父组件发送事件this.title = '';this.body = '';},},
};
</script>

5. 主视图

src/views/Home.vue中使用ArticleList组件:

<template><div><ArticleList /></div>
</template><script>
import ArticleList from '../components/ArticleList.vue';export default {components: { ArticleList },
};
</script>

6. 文章视图

src/views/ArticleView.vue中使用ArticleDetail组件:

<template><div><ArticleDetail :id="id" /></div>
</template><script>
import ArticleDetail from '../components/ArticleDetail.vue';export default {components: { ArticleDetail },props: ['id'],
};
</script>

7. 配置App.vue

确保在src/App.vue中引入并使用router:

<template><router-view />
</template><script>
import { createRouter, createWebHistory } from 'vue-router';
import router from './router';export default {name: 'App',router,
};
</script>

五、总结与展望

通过今天的项目实践,你应该对Vue 3的组件、路由和API交互有了更深的理解。接下来的最后一天,我们将整合所有的学习内容,准备一个精彩的项目展示。希望你能思考如何进一步优化和扩展这个博客应用,为未来的项目打下基础。

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

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

相关文章

Windows Docker运行Implicit-SVSDF-Planner

Windows Docker运行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 设置环境 我将项目git clone在D:/Github目录中。 下载ubuntu20.04 noetic镜像 docker pull osrf/ros:noetic-desktop-full-focal 启动容器&#xff0c;挂载主机的D:/Github文…

PHP 安全与加密:守护 Web 应用的基石

PHP 学习资料 PHP 学习资料 PHP 学习资料 在当今数字化时代&#xff0c;Web 应用无处不在&#xff0c;而 PHP 作为一种广泛使用的服务器端脚本语言&#xff0c;承载着无数网站和应用的核心逻辑。然而&#xff0c;随着网络攻击手段日益复杂&#xff0c;PHP 应用面临着诸多安全…

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类&#xff0c;这就是QPdfWriter类。 &#xff08;1&#xff09;PDF文件生成 支持创建新的PDF文件或覆盖已有文件&#xff0c;通过构造函数直接绑定文件路径或QFile对象&#xff1b; 默认生成矢量图形PDF&#…

Golang GORM系列:GORM无缝集成web框架

高效的数据管理是每个成功的web应用程序的支柱。GORM是通用的Go对象关系映射库&#xff0c;它与流行的Go web框架搭配得非常好&#xff0c;提供了无缝集成&#xff0c;简化了数据交互。本指南将带你探索GORM和web框架&#xff08;如Gin&#xff0c; Echo和Beego&#xff09;之间…

SAM C++ TensorRT(实时图像分割)

SPEED SAM C TENSORRT &#x1f310; 1、概述 用于SAM&#xff08;segment anything model分割一切模型&#xff09;的TensorRT和CUDA优化的高表现C实现&#xff0c;特别适用于实时图像分割任务。 &#x1f4e2; 更新 模型转换&#xff1a;从ONNX模型构建TensorRT引擎以加速…

【LLAMA】羊驼从LLAMA1到LLAMA3梳理

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 LLAMA 1到3梳理 1. LLAMA 1 论文&#xff1a; LLaMA: Open and Efficient Foundation Language Models 时间&#xff1a; 2023.02 1.1 前言…

什么是网络安全?网络安全防范技术包括哪些?

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…

【从0做项目】Java搜索引擎(7) web模块

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 文章导读 零&#xff1a;项目结果展示 一&#xff1a;后端web模块 1&#xff1a;思路 2&#xff1a…

Visual Studio Code 集成 Baidu Comate

文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标&#xff0c;然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮&#xff0c;等待安装完毕…

WeMos D1+PIR+Android 的小场景制作

最近在做一个有趣的小场景功能&#xff0c;其实已经有成熟产品&#xff0c;但是考虑到没法实现场景扩展&#xff0c;所以自己开始动手做。 场景描述&#xff1a;玄关人体感应&#xff0c;有人进门&#xff0c;致欢迎词&#xff0c;有人离开&#xff0c;致欢送词。 硬件设备&a…

Android ListPreference使用

Android ListPreference使用 参考 添加链接描述 导入 androidx.preference.ListPreferenceListPreference是Android中的一个Preference子类,用于显示一个可选择的列表,并且可以保存用户所选择的值。它继承自DialogPreference,可以在用户点击时弹出一个对话框,显示可选择的…

Spring Security实现记住我功能的实战指南

在现代Web应用中&#xff0c;"记住我"功能是提升用户体验的重要特性之一。用户无需在每次访问时重新登录&#xff0c;这不仅方便&#xff0c;还能增强用户对应用的粘性。今天&#xff0c;我们将通过一个具体的实例&#xff0c;详细探讨如何在Spring Security中实现&q…

用命令模式设计一个JSBridge用于JavaScript与Android交互通信

用命令模式设计一个JSBridge用于JavaScript与Android交互通信 在开发APP的过程中&#xff0c;通常会遇到Android需要与H5页面互相传递数据的情况&#xff0c;而Android与H5交互的容器就是WebView。 因此要想设计一个高可用的 J S B r i d g e JSBridge JSBridge&#xff0c;不…

ModuleNotFoundError: No module named ‘timm.optim.novogr两种解决方法

运行报错 from timm.optim.novograd import NovoGradModuleNotFoundError: No module named ‘timm.optim.novograd’。 问题原因 timm版本过高&#xff0c;novograd函数已被抛弃。 解决办法 方法1&#xff1a;安装更低版本的timm pip install timm0.4.12方法2&#xff1a…

DeepSeek 本地部署指南:从零开始搭建 AI 搜索工具

1. 引言 背景介绍 DeepSeek 是一款基于 AI 的搜索工具&#xff0c;能够高效处理海量数据&#xff0c;提供精准的搜索结果。它结合了 Ollama 的模型管理能力&#xff0c;使得部署更加便捷。 为什么选择本地部署 本地部署可以确保数据隐私&#xff0c;避免云端传输的风险&…

昇腾DeepSeek模型部署优秀实践及FAQ

2024年12月26日&#xff0c;DeepSeek-V3横空出世&#xff0c;以其卓越性能备受瞩目。该模型发布即支持昇腾&#xff0c;用户可在昇腾硬件和MindIE推理引擎上实现高效推理&#xff0c;但在实际操作中&#xff0c;部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…

vscode复制到下一行

linux中默认快捷键是ctrl shift alt down/up 但是在vscode中无法使用&#xff0c;应该是被其他的东西绑定了&#xff0c;经测试&#xff0c;可以使用windows下的快捷键shift alt down/up { “key”: “shiftaltdown”, “command”: “editor.action.copyLinesDownAction”…

网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件

一、前言 最近几个月里&#xff0c;我一直在学习网络爬虫方面的知识&#xff0c;每有收获都会将所得整理成文发布&#xff0c;不知不觉已经发了7篇日志了&#xff1a; 网络爬虫学习&#xff1a;从百度搜索结果抓取标题、链接、内容&#xff0c;并保存到xlsx文件中 网络爬虫学…

Arduino 第十六章:pir红外人体传感器练习

Arduino 第十六章&#xff1a;PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中&#xff0c;传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR&#xff08;被动红外&#xff09;传感器。PIR 传感器能够检测人体发出的红外线&#xff0c;常用于安防系统、自动…

CV -- YOLOv8 图像分割(GPU环境)

目录 参考视频&#xff1a; 标注 JSON转为TXT 训练 验证 参考视频&#xff1a; 使用 Yolov8 自定义数据集进行图像分割_哔哩哔哩_bilibili 标注 数据集&#xff1a; 我使用的是一些苹果数据集&#xff0c;可以在我的csdn资源中下载&#xff1a; https://download.csdn.net/do…