vue2项目从0搭建(一):项目搭建

前言:

vue2项目可谓十分常见,国内大部分的前端码农应该都是用vue2技术在开发,虽然vue3和react等技术也有很多,但是占据绝大多数的中高级搬砖码农应该干的都是vue2技术的项目,就算现在很多人转战vue3技术了,但是维护原有vue2的项目应该也是很多的。

我本来是不打算写vue2的技术博客的,因为这种的博客实在太多了。但是我还是想了想,自己入坑就是靠vue2的,而且vue2虽然算不上先进的技术了,但依然占据很大的比例,而且很多人是看视频学习的,而不是官网.就算查东西,也是很少去官网,都是直接百度。

最主要的一点,其实不少人是没有从0到1对一个项目进行开发的,大部分都是接受原有的项目或者是省事直接用人家的模板,我决定从0搭建一个vue2的项目,这个项目主要是用来写vue2本身一些技术点的demo,因为我知道很多人就算用了2年的vue,也不见得能把官网的技术都看一遍,这里我对主要的技术进行一个总结,需要的小伙伴可以看看。

使用vue-cli下载脚手架: 

 vue-cli地址:介绍 | Vue CLI

 安装:

方法1:

安装全局的vue:

npm install -g @vue/cli

执行下载命令:

vue create vue2-test

 方法2:

npx vue create vue2-test

这个脚手架会为你自动去配置依赖包node_modules的,安装成功之后可以直接运行项目

 运行:

npm run serve

关闭语法检查和配置src路径别名

关闭语法检查

语法检查对于没有精益求精唯薪主义码农们,是一件很烦人的事情,那我们就果断干掉他(大佬不用看)

在vue.config.js中进行如下配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,lintOnSave: false
})

配置src路径别名

配置src的路径联想,可以让我们在项目文件较多时,可以快速精确的找到所需文件路径

创建jsconfig.json

{"compilerOptions": {"target": "es5","module": "esnext","baseUrl": "./","moduleResolution": "node","paths": {"@/*": ["src/*"]},"lib": ["esnext","dom","dom.iterable","scripthost"]}
}

ok了,重新运行项目,记得重新运行才回生效

基础的router配置和创建对应组件:

vue-router是spa项目必须的东西,vue-router的配置项也不少,不过我们这里先进行最基础的配置

下载vue-router

npm i vue-router@3.1.2

 创建组件

删除App.vue中的HelloWord组件和信息,在src下创建自己对应的pages文件夹,我这里创建目录结构如下:

vue文件的初始化内容我就不写那么明白了,参考App.vue

创建好了组件之后,记得给每个组件的name名字起好。

配置基础的router

在src下创建router文件夹,内部包含三个文件

globalRouteList.js: 全局的路由数据

const globalRouteList = [{name:'login',path:'/login',meta:{name:'登录',},component:()=>import('@/pages/login/index.vue')},{name:'notFound',path:'/notFound',meta:{name:'空页面',},component:()=>import('@/pages/notFound/index.vue')},{redirect:'/login',path:'/'}
]
export default globalRouteList

asyncRouteList.js: 动态的路由数据

const list = [{name:'dashboard',path:'/dashboard',meta:{name:'主页',},component:()=>import('@/pages/dashboard/index.vue'),children:[{name:'communication',path:'/dashboard/communication',meta:{name:'组件通信',icon:'el-icon-phone'},component:()=>import('@/pages/communication/index.vue')},{name:'instructions',path:'/dashboard/instructions',meta:{name:'指令',icon:'el-icon-thumb'},component:()=>import('@/pages/instructions/index.vue')},]},]
export default list

index.js : 路由配置文件

import Vue from 'vue'
import Router from 'vue-router'
import asyncRouteList from './asyncRouteList'
import globalRouteList from './globalRouteList'const RouteList = [].concat(asyncRouteList).concat(globalRouteList)
console.log(RouteList,'???routeList')
Vue.use(Router)export default new Router({routes:RouteList,mode:'history'
})

 然后再main.js中引入我们配置好的router

  main.js中引入

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'Vue.config.productionTip = falseVue.use(router)new Vue({router,render: h => h(App),
}).$mount('#app')

 现在在vue组件中就能访问到this$router和this.$route了。

引入element-ui

element-ui地址:Element - The world's most popular Vue UI framework

 下载element-ui

npm i element-ui

 main.js引入element-ui:

方法1.整体引入

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = falseVue.use(router)
Vue.use(ElementUI)
new Vue({router,render: h => h(App),
}).$mount('#app')

 方法2:分别引入(这块在后续的优化中写,这里就不说了,有需要的可以参考官网)

现在在组件中就可以使用饿了么组件

配置store

vuex虽然不是必须的,但是在常规的vue项目中,存储全局的一些数据vuex还是很简单灵性的,vue3很多人用pinia,但是我感觉vue2项目基本都有vuex,还是用上吧

vuex地址:Vuex 是什么? | Vuex

这里插一句:我其实有一段时间没有写vue2了,我现在做的这些配置都是自己一个一个用手敲的,而且都是参考我所引入的这些文档

下载vuex

src下创建store文件夹,内部文件如下

index.js : store的主要文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import user from './modules/user'
const store = new Vuex.Store({modules:{user}
})
export default store

moudles/user.js : user模块化

const userMode = {state:()=>({userInfo:{name:'wjt',age:28}}),mutations:{CHANGE_USEINFO:(state,info)=>{state.userInfo = info}},actions:{changeUserInfo:(({commit},data)=>{commit('CHANGE_USEINFO',data)})}
}
export default userMode

modules/globalCom: 全局数据模块化

...暂无内容

 

main.js引入

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'
import store from './store/index'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import '@/style/reset.css'
Vue.config.productionTip = falseVue.use(router)
Vue.use(store)
Vue.use(ElementUI)
new Vue({router,store,render: h => h(App),
}).$mount('#app')

引入样式初始化文件

在项目开发时,初始化样式文件还是很有必要的,能给后面省去一些麻烦,这里我就直接引入一个在网上拉下来的文件了,就没有必要自己手写

文件内容如下:

blockquote,body,button,dd,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,hr,input,legend,li,ol,p,pre,td,textarea,th,ul {margin: 0;padding: 0
}body,button,input,select,textarea {font: 12px/1.5 tahoma,arial,'Hiragino Sans GB','\5b8b\4f53',sans-serif
}h1,h2,h3,h4,h5,h6 {font-size: 100%
}address,cite,dfn,em,var {font-style: normal
}code,kbd,pre,samp {font-family: courier new,courier,monospace
}small {font-size: 12px
}ol,ul {list-style: none
}a {text-decoration: none
}a:hover {text-decoration: underline
}sup {vertical-align: text-top
}sub {vertical-align: text-bottom
}legend {color: #000
}fieldset,img {border: 0
}button,input,select,textarea {font-size: 100%
}table {border-collapse: collapse;border-spacing: 0
}京东的reset* {margin: 0;padding: 0
}em,i {font-style: normal
}li {list-style: none
}img {border: 0;vertical-align: middle
}button {cursor: pointer
}a {color: #666;text-decoration: none
}a:hover {color: #c81623
}button,input {font-family: Microsoft YaHei,tahoma,arial,Hiragino Sans GB,\\5b8b\4f53,sans-serif
}body {-webkit-font-smoothing: antialiased;background-color: #fff;font: 12px/1.5 Microsoft YaHei,tahoma,arial,Hiragino Sans GB,\\5b8b\4f53,sans-serif;color: #666
}.hide,.none {display: none
}.clearfix:after {visibility: hidden;clear: both;display: block;content: ".";height: 0
}.clearfix {*zoom: 1
}百度的resetbody,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td {margin: 0;padding: 0
}html {color: #000;overflow-y: scroll;overflow: -moz-scrollbars
}body,button,input,select,textarea {font: 12px arial
}h1,h2,h3,h4,h5,h6 {font-size: 100%
}em {font-style: normal
}small {font-size: 12px
}ul,ol {list-style: none
}a {text-decoration: none
}a:hover {text-decoration: underline
}legend {color: #000
}fieldset,img {border: 0
}button,input,select,textarea {font-size: 100%
}table {border-collapse: collapse;border-spacing: 0
}img {-ms-interpolation-mode: bicubic
}textarea {resize: vertical
}.left {float: left
}.right {float: right
}.overflow {overflow: hidden
}.hide {display: none
}.block {display: block
}.inline {display: inline
}.error {color: #F00;font-size: 12px
}label,button {cursor: pointer
}.clearfix:after {content: '\20';display: block;height: 0;clear: both
}.clearfix {zoom: 1
}.clear {clear: both;height: 0;line-height: 0;font-size: 0;visibility: hidden;overflow: hidden
}

在main.js中引入

配置基础页面

登录页:

login.vue

<template><div><el-button @click="login" type="primary">登录</el-button></div> 
</template>
<script>export default {name:'login',data(){return{}},methods:{login(){this.$router.push('/dashboard')}}}
</script>
<style></style>

dashboard.vue页面(主要容器页面)

<template><div class="layout"><header class="header"><div class="logo"><h1>Vue2练习</h1></div> </header><content class="content"><div class="leftMenu"><el-menu:default-active="leftMenu[0].name"class="el-menu-vertical-demo"@open="handleOpen"@close="handleClose"background-color="#545c64"text-color="#fff"active-text-color="#ffd04b"><el-menu-item :index="item.name" v-for="(item,index) in leftMenu" :key="index" @click="changeMenuItem(item)"><i :class="item.meta.icon"></i><span slot="title">{{ item.meta.name }}</span></el-menu-item></el-menu></div><div class="rightbox"><router-view></router-view></div></content></div>
</template>
<script>export default {name:'dashboard',data(){return{leftMenu:[],}},methods: {handleOpen(key, keyPath) {console.log(key, keyPath);},handleClose(key, keyPath) {console.log(key, keyPath);},changeMenuItem(item){this.$router.push(item.path)}},created(){console.log(this.$router,'??路由信息')this.leftMenu = this.$router.options.routes.find(item=>item.name === 'dashboard').children || []}}
</script>
<style lang="less" scoped>
::v-deep(.el-menu){border:none;
}
.layout{height:100vh;width:100vw;.header{height:100px;width:100%;background-color:#535b65;.logo{background-color:#fff;height:100%;width:200px;color:#000;display:flex;h1{margin:auto;font-size:20px;font-weight:600;}}}.content{flex:1;display:flex;height:calc(~"100vh - 100px");background-color:#fff;.leftMenu{width:200px;height:100%;background-color:#535b65;}.rightbox{flex:1;height:100%;}}
}</style>

ok,这个最基本的配置也就完成了,效果如下:

也是可以查看到我们配置的store和router。

代码直接复制就可以了,项目的基础配置完成,后续的模块都是vue技术的demo,或者模拟具体业务的

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

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

相关文章

Java17新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…

Clickhouse学习笔记(14)—— Clickhouse监控

ClickHouse 运行时会将一些个自身的运行状态记录到众多系统表中&#xff0c;如下所示&#xff1a; 为了直观方便地监控ck的运行情况&#xff0c;使用Prometheus Grafana 的组合来进行监控 Prometheus 负责收集各类系统的运行指标&#xff1b;Grafana 负责可视化 Prometheus&a…

实体门店创新神器曝光,拓世法宝AI智能直播一体机助力商家快速惊艳逆袭

在这个飞速变革的时代&#xff0c;传统实体门店面临着多重挑战。为了迎接市场的巨大变化&#xff0c;许多实体门店迫切寻求创新的方法来吸引顾客的眼球。数字化手段和新技术的引入成为实体门店应对市场需求的重要选择之一&#xff0c;是应对激烈竞争和不断变化的消费者行为的有…

WGCLOUD的特点整理

做运维工作很多年了&#xff0c;项目中用过不少的运维软件工具&#xff0c;今天整理下WGCLOUD的特点&#xff08;优点&#xff09; 首先WGCLOUD是完全免费的 部署使用&#xff1a;部署简单方便&#xff0c;上手容易&#xff0c;几乎没有学习成本&#xff0c;对新手友好 文档…

thinkphp 自定义错误页面

在访问无效的UI 这个效果不好&#xff0c;要改成自定义的 <?php namespace app\controller;class ErrorController {public function __call($method,$args){return error request!;} }之后就是提示

hive更改表结构的时候报错

现象 FAILED: ParseException line 1:48 cannot recognize input near ADD COLUMN compete_company_id in alter table statement 23/11/14 17:59:27 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 1:48 cannot recognize input near ADD COLUMN compe…

upload-labs关卡8(基于黑名单的点绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第八关通关思路1、看源代码2、点绕过3、验证文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试&am…

计算机毕业设计选题推荐-记录生活微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

跨国企业如何选择安全靠谱的跨国传输文件软件?

随着全球化的不断发展&#xff0c;跨国企业之间的合作变得越来越频繁。而在这种合作中&#xff0c;如何安全、可靠地将文件传输给合作伙伴或客户&#xff0c;成为了跨国企业必须面对的问题。 然而&#xff0c;跨国文件传输并不是一件容易的事情&#xff0c;由于网络物理条件的…

什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?

什么是代理模式&#xff1f; 代理&#xff08;Proxy&#xff09;是一种结构型设计模式&#xff0c;其目的是通过引入一个代理对象来控制对另一个对象的访问。代理对象充当目标对象的接口&#xff0c;这样客户端就可以通过代理对象间接地访问目标对象&#xff0c;从而在访问过程…

【Python图像超分】Real-ESRGAN图像超分模型(超分辨率重建)详细安装和使用教程

1 前言 图像超分是一种图像处理技术&#xff0c;旨在提高图像的分辨率&#xff0c;使其具有更高的清晰度和细节。这一技术通常用于图像重建、图像恢复、图像增强等领域&#xff0c;可以帮助我们更好地理解和利用图像信息。图像超分技术可以通过多种方法实现&#xff0c;包括插值…

CSS 文字溢出省略号显示

1. 单行文本溢出显示省略号 需要满足三个条件&#xff0c;添加对应的代码&#xff1a; &#xff08;1&#xff09;先强制一行内显示文本&#xff1b; &#xff08;2&#xff09;超出的部分隐藏&#xff1b; &#xff08;3&#xff09;文字用省略号来替代省略的部分&#xf…

IDEA 使用Reset Current Branch to Here 进行git 版本控制,图文操作

文章目录 一、总结区别&#xff08;只针对本地仓库操作&#xff09;Soft详细解释文件版本冲突处理 Mixed详细解释Hard详细解释Keep详细解释文件版本冲突处理 二、其他Revert commit 参考文档 一、总结区别&#xff08;只针对本地仓库操作&#xff09; Soft详细解释 Soft操作只…

docker命令大全

1、查看Docker 容器占用的空间 docker ps -s2、查看所有容器 docker ps -a3、启动、关闭、重启一个已存在的容器 docker start <容器ID> docker stop <容器ID> docker restart <容器ID> 4、进入容器&#xff0c;退出终端的时候不会关闭container的ma…

龙讯旷腾PWmat:新的催化反应机理——瞬态相变,对多相电催化剂的设计和多相电催化机理的研究具有重要意义

研究背景 众所周知&#xff0c;材料的性质&#xff0c;包括催化活性都是相敏感的。而材料的相与外界条件有关&#xff0c;电催化反应过程中的外部条件与反应前后的外部条件不同&#xff0c;这自然导致了一个问题&#xff1a;在反应过程中电催化剂的相是否可以与反应前后的相不…

C 语言数组

C 语言数组 在本教程中&#xff0c;您将学习如何使用数组。您将借助示例学习如何声明&#xff0c;初始化和访问数组的元素。 数组是可以存储多个值的变量。例如&#xff0c;如果要存储100个整数&#xff0c;则可以为其创建一个数组。 示例 cint data[100];如何声明数组&…

线程池的使用

线程池的作用 降低线程创建和销毁的开销&#xff1a;线程的创建和销毁是比较昂贵的操作。通过使用线程池&#xff0c;可以避免频繁地创建和销毁线程&#xff0c;而是复用线程池中已经存在的线程&#xff0c;从而降低了开销。 控制并发度&#xff1a;通过控制线程池中线程的数量…

MySQL(14):视图

数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&#xff0c;只…

mysql 讲解(1)

文章目录 前言一、基本的命令行操作二、操作数据库语句2.1、创建数据库2.2、删除数据库2.3、使用数据库2.4 查看所有数据库 三、列的数据类型3.1 字符串3.2 数值3.3 时间日期3.4 空3.5 int 和 varchar问题总结&#xff1a; 四、字段属性4.1 UnSigned4.2 ZEROFILL4.3 Auto_InCre…

ARPG----C++学习记录05 Section12 动画蒙太奇,收拿剑,MetaSound,调整动画

代码更新 https://github.com/BAOfanTing/ARPG_Game_Code/commit/c629270e49496ba1bcbaf03780d23c1842ca5e7a Animation Montages动画蒙太奇 蒙太奇的工作流程 新建一个鼠标左键的按键映射&#xff0c;下载一些攻击动画&#xff0c;重定向给我们的人物&#xff0c;新建一个动画…