还没搭建过Vue3.x项目?几行代码搞定~

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列

相信现在有很多人在用Vue3.0开发项目,但是很多时候没有机会从零开始搭建一个项目,毕竟只有负责人才会有机会将框架给我们搭建出来,然后我们在此基础上进行业务迭代、模块开发,今天就一起来从零搭建一个Vue3.0的最小原型系统,让人人都具备从零开启一个项目的能力。

一、 项目初始化

既然用Vue3.0构建最小原型系统,那么肯定要用尤大的最新构建工具Vite来进行项目的初始化,初始化指令如下所示:

npm init vite@latest

初始化后的目录结构如下所示:

752520d654b9bf46e708f76e15be18f3.png
image-20220212223602320.png

注:前面已写了Vite相关文章,可点开链接阅读巩固好记性不如烂笔头——Vite篇

二、引入UI框架

Vite已经帮助我们完成了项目的初始化,下一步就是引入UI框架,毕竟UI框架帮助我们造了很多轮子,省去了很多工作,提高开发效率。在Vue3.0中,用的比较多的UI框架有Element Plus,下面就一步步引入该UI框架。

  1. 安装element-plus包

npm install element-plus -S
  1. 在main.js文件中全局引入

import { createApp } from 'vue'
import App from './App.vue'
// 引入element-plus包
import ElementPlus from 'element-plus';
// 引入对应的样式
import 'element-plus/theme-chalk/index.css';const app = createApp(App);
app
.use(ElementPlus)
.mount('#app')
  1. 全局引入后即可在对应的组件中使用

注:除了全局引入组件外,还可以引入部分组件,从而减少打包体积。

三、引入状态管理器Vuex

作为Vue的配套内容,Vuex必不可少,其采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。下面就一起引入Vuex。

  1. 安装对应的vuex包

npm install vuex -S
  1. 在文件夹下建立对应的文件目录,按如下指令执行即可构建其最简单结构

cd ./src
mkdir store
cd ./store
touch index.js
mkdir ./module
cd ./module
touch moduleA.js
c2fad9d103f43eecf69dedfff785e1c4.png
image-20220213000625835.png
  1. 在建立好目录结构后,按照如下文件即可实现对应文件中的内容

(1) index.js文件

// index.js文件
import {createStore} from "vuex";import {moduleA} from "./module/moduleA";export const store = createStore({// Vuex允许将store分割成模块(module),每个模块拥有自己的state、mutation、action、getter、甚至是嵌套子模块// 访问moduleA的状态:store.state.moduleAmodules: {moduleA}
});

(2)moduleA.js文件

// module/moduleA.js文件
// 对于模块内部的mutation和getter,接收的第一个参数是模块的局部状态对象
// 对于模块内部的action,局部状态通过context.state暴露出来,根节点状态则为context.rootState
// 对于模块内部的getter,根节点状态会作为第三个参数暴露出来// 在带命名空间的模块内访问全局内容
// 如果希望使用全局state和getter,rootState和rootGetters会作为第三和第四个参数传入getter,也会通过context对象的属性传入action
// 若需要在全局命名空间内分发action或提交mutation,将{root: true}作为第三个参数传给dispatch或commit即可。export const moduleA = {// 默认情况下,模块内部的action、mutation和getter是注册在全局命名空间的,如果希望模块具有更高的封装度和复用性,可以通过添加namespaced:true的方式使其成为带命名空间的模块namespaced: true,state: {testState1: 'xxxx',testState2: {a: 0,b: 1},testState3: 0},// 有的时候需要从store中的state中派生出一些状态,此时可以将该部分抽象出一个函数供多处使用。// Vuex允许在store中定义getter,像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当他的依赖值发生了改变才会被重新计算getters: {// getter接收state作为其第一个参数testGetter1: state => {return state.testState1 + state.testState3;},// getter可以接受其他getter作为第二个参数testGetter2: (state, getters) => {return getters.testGetter1.length;}},// 更改Vuex的store中的状态的唯一方法是提交mutation,每个mutation都有一个字符串的事件类型和一个回调函数,该回调函数接收state作为第一个参数,提交的载荷作为第二个参数// 以相应的type调用store.commit方法来触发相应的回调函数// Mutation必须是同步函数mutations: {testMutation1(state) {// 变更状态state.testState3++;},// 第二个参数是载荷testMutation2(state, payload) {state.testState1 += payload.content;}},// Action提交的是mutation,而不是直接变更状态// Action可以包含任意异步操作// Action函数接受一个与store实例具有相同方法和属性的context对象,因此可以调用context.commit提交一个mutation,或者通过context.state和context.getters来获取state和getters。// Action通过store.dispatch方法触发actions: {testAction1(context) {setTimeout(() => {context.commit('testMutation1');}, 1000);},testAction2({commit}, payload) {setTimeout(() => {commit({type: 'testMutation2',content: payload.content});}, 1000);}}
};
  1. 然后在main.js文件中引入该部分内容

// ……
import {store} from './store';const app = createApp(App);
app
.use(store)
.use(ElementPlus)
.mount('#app')
  1. 然后在对应组件中进行使用,具体详细使用内容可以看此处内容

用最简的方式学Vuex

四、引入路由Vue-Router

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌,下面就在项目中引入Vue-Router。

  1. 安装对应的vue-router包

npm install vue-router@4 -S
  1. 在文件夹下建立对应的文件目录,按如下指令执行即可构建其最简单结构

cd ./src
mkdir router
cd ./router
touch index.js
  1. 在index.js文件中完善对应的内容

import {createRouter, createWebHashHistory} from 'vue-router';const routes = [{path: '/',redirect: '/component1'},{path: '/component1',name: 'component1',component: () => import('../components/Component1.vue')},{path: '/component2',name: 'component2',component: () => import('../components/Component2.vue')}
];const router = createRouter({history: createWebHashHistory(),routes
});export default router;
  1. 在main.js中引入router

// ……
import router from './router';const app = createApp(App);
app
.use(store)
.use(router)
.use(ElementPlus)
.mount('#app')
  1. 在App.vue文件中使用组件,这样就可以根据路由访问不同内容了

<script setup>
</script><template><router-view></router-view>
</template>

五、引入自定义插件

自定义插件在很多情况下也必要重要,前面已经有对应章节阐述了如何自定义插件(Vue3.0插件执行原理与实战),我们仅需要在src下创建plugins目录放置自己的自定义插件即可。

六、API

纯前端项目真的很少,多多少少都会与后端进行交互,当前主流项目中与后端常用Axios库,该库帮助我们做了很多事情,节省了很多造轮子的时间(具体Axios使用可以阅读曾经的文章三步法解析Axios源码)。下面就让我们一起一步步设计自己的请求API:

  1. 安装axios

npm install axios -S
  1. 进一步封装axios的请求(封装方式千万条,选择适合自己的就好)

// /src/utils/request.js
import axios from 'axios';const service = axios.create({baseURL: '/api',timeout: 9999
});// 请求拦截器
service.interceptors.request.use(config => {// 做一些请求前的处理,例如添加一些头信息、token信息等return config;},error => {return error;}
);// 响应拦截器
service.interceptors.response.use(response => {// 根据响应做一些处理,例如将响应信息存储到store中等},error => {return error;}
);export default service;
  1. 然后在src目录下建立api文件,里面就是与业务逻辑相关的请求,例如如下所示:

import service from "../utils/request";export const testPost = data => {return service({url: '/base',method: 'post',data});
};

至此,已经完成了Vue3.0的最小原型系统,然后就可以在此基础上根据业务需求进行迭代。

bb7ff1ab776ce5b10290280b768bbc96.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经写了7篇,点击查看年度总结。
同时,最近组织了源码共读活动,帮助3000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

a2fd83746464e80da7c5ce6f1e0805a7.png

识别方二维码加我微信、拉你进源码共读

今日话题

略。分享、收藏、点赞、在看我的文章就是对我最大的支持~

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

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

相关文章

一步步创建 边栏 Gadget(二)

相信使用上篇中创建的边栏Gadget之后&#xff0c;大家会很郁闷。难道视频窗口就那么小吗&#xff1f;看起来真费劲。我能通过该Gadget看着一部电视剧。而不能够定制自己需要的或者想要看的电视剧。 在上一篇一步步创建 边栏 Gadget&#xff08;一&#xff09;中&#xff0c;我们…

tableau 自定义图表_一种新的十六进制美国地图布局的案例-Tableau中的自定义图表

tableau 自定义图表For whatever reason, 无论出于什么原因 maps are cool. Even though the earth has mostly been the same since those 地图很酷 。 即使自Pangaea days, we humans make and remake maps constantly. It might be that old maps remind us of how things …

2022,前端工具链十年盘点

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列2021 …

书籍排版学习心得_为什么排版是您可以学习的最佳技能

书籍排版学习心得重点 (Top highlight)I was introduced to design in a serpentine fashion. I don’t have any formal training. Instead, I’ve learned everything through the Web, books, and by interacting with designers daily.我被介绍为蛇形设计。 我没有任何正规…

若川的 2021 年度总结,弹指之间

1前言从2014年开始&#xff0c;每一年都会写年度总结&#xff0c;已经坚持了7个年头。7年的光阴就是弹指之间&#xff0c;转瞬即逝。正如孔子所说&#xff1a;逝者如斯夫&#xff0c;不舍昼夜。回顾2014&#xff0c;约定2015&#xff08;QQ空间日志&#xff09;2015年总结&…

线框图用什么软件_为什么要在线框中着色?

线框图用什么软件I was recently involved in a debate around why some wireframes (which were definitely not UI screens) were not 100% greyscale. This got me thinking — when is it ok to use colour in wireframes, and when is it going to cause you problems fur…

Linux 内核

Linux 内核是一个庞大而复杂的操作系统的核心&#xff0c;不过尽管庞大&#xff0c;但是却采用子系统和分层的概念很好地进行了组织。通过本专题&#xff0c;我们可以学习 Linux 的分层架构、内核配置和编译、内核性能调试和 Linux 2.6 中的许多提升功能。Linux 内核组成 Linux…

给asterisk写app供CLI调用

环境&#xff1a;CentOS6.2 Asterisk 1.8.7.1 一、添加源文件 复制app_verbose.c为app_testApp.c 复制app_verbose.exports为app_testApp.exports 主要是修改一些标识&#xff0c;编译不会出错就行&#xff0c;这里列出我进行的主要修改。 1、添加头文件 #include "aster…

前端,校招,面淘宝,指南

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列虽然是…

qq空间网页设计_网页设计中负空间的有效利用

qq空间网页设计Written by Alan Smith由艾伦史密斯 ( Alan Smith)撰写 Negative space is a key design element that you may come across in the fields of art, architecture, interior design, landscaping and web design. Rather than serving as awkward, empty areas …

Git 和 GitHub 教程——版本控制入门

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列Learn…

matlab中的:的优先级_内容早期设计:内容优先

matlab中的:的优先级By Simone Ehrlich, Content Strategy Manager由 西蒙埃利希 &#xff0c;内容策略经理 Words are cheap. Cheaper than wires; cheaper than mocks. That doesn’t mean words aren’t important, just less expensive to produce as a design asset. So …

我真的哭了,哭过后呢(-)

这些是山区的孩子们&#xff01; 这是他们的教室。这个也算是&#xff01;如此的师资力量自己解决吃饭问题冬天到了&#xff0c;一起烤烤火与泥土污水一起还好&#xff0c;最大的数字只是10老师抱着孩子来给我们上课了不知道山那边会是什么呢&#xff1f;又一双充满了渴望的大眼…

脑裂问题解决方案_从解决方案到问题

脑裂问题解决方案Once upon a time a couple of years ago, one of my mentors (and favourite people in the world) repeatedly drilled the idea above into my brain. Her advice for Product people was to “fall in love with the problem, not the solution”. At the …

Vue.js 官方团队成员霍春阳新作,深入解析 Vue.js 设计细节【文末送书】

霍春阳&#xff08;Hcy&#xff09;&#xff0c;Vue.js 官方团队成员。专注于 Web 研发领域&#xff0c;是 Vue.js 3 的核心贡献者之一&#xff0c;Vue.js 文档生成工具 Vuese 的作者&#xff0c;技术社区活跃者&#xff0c;曾撰写大量颇受好评的技术博客。经过一年的准备&…

LINQ之路 5:LINQ查询表达式

书写LINQ查询时又两种语法可供选择&#xff1a;方法语法&#xff08;Fluent Syntax&#xff09;和查询表达式&#xff08;Query Expression&#xff09;。 LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询。C# 3.0对于LINQ表达式还引入了声明式的查询表达式&#xf…

调查谋杀案以换取Obra Dinn

回顾性 (RETROSPECTIVE) I am not sure if this is intentional, but Lucas Pope has a knack for turning the mundane into something special. This was evident in his release of Papers Please. In that game, you’re a border patrolman trying to provide for your fa…

9年前的大一,我们这样为女生过37女生节【祝节日快乐】

这是一篇水文~没啥目的&#xff0c;若说要有&#xff0c;就是希望大家参加源码共读学起来。公众号后台显示所有读者朋友中大约有23%的女生。前端工程师中女生应该占比相对多些。祝关注我公众号的女生3.7女生节快乐&#xff0c;大部分公司明天应该都有半天假期。可以留言大学时你…

requests模块发送带headers的Get请求和带参数的请求

1.在PyCharm开发工具中新建try_params.py文件&#xff1b; 2.try_params.py文件中编写代码&#xff1a; import requests#设置请求Headers头部header {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}#请求输入参数p…

面试官问:跨域请求如何携带cookie?

大家好&#xff0c;我是若‍川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列本文…