通过vue-cli脚架的搭建,我们得到一个初始化的项目,我们删除对应不需要的文件,比如里面的logo,链接,hellWord文件,等到一个没有其他的框架,然后我们就要来搭建项目,怎么要搭建项目才可以方便维护和扩展,这里我们来讨论的是APP的目录,
思路就是几种
- 根据模块来划分,比如一般的APP都有首页,个人中心,产品,登录,等等模块,可以按照大模块来划分
- 根据功能来划分,比如登录里面包含注册,找回密码; 绑定信息里面包含修改,增加,删除,查看
- 根据导航来划分,比如侧边栏,tabbar栏,楼层栏等等
- 根据需求来划分,比如登录交互需求,产品交互需求,信息交互需求等等
这里我们按照常规的APP,tabbar页面->tabbar页面->对应的子页面这样的项目需求来构建项目
第一步:根据tabbar搭建对应的目录,这里我们就做两级目录,剩下的页面不创建目录,直接创建页面
这里的tabbar有五个,所以我们对应的要在脚架的scr目录下的components创建对应的文件夹以及对应的VUE文件,以及一个入口文件,这个入口文件是做一下逻辑操作处理,比如校验token,判断跳转等待;
配置路由
import Vue from 'vue'
import Router from 'vue-router'
import home from '@/components/home/hone';
import index from '@/components/index/index';
import store from '@/components/store/store';
import ore from '@/components/ore/ore';
import mine from '@/components/mine/mine';
import transaction from '@/components/transaction/transaction';
Vue.use(Router)
export default new Router({
routes: [{
path: '/',
name: 'index',
component: index,
children: [{
path: 'home',
name: 'home',
component: home,
},
{
path: 'store',
name: 'store',
component: store
},
{
path: 'ore',
name: 'ore',
component: ore
},
{
path: 'transaction',
name: 'transaction',
component: transaction
},
{
path: 'mine',
name: 'mine',
component: mine
}
]
},
]
})
写个tabbar,填充,因为是APP,所以用到REM,这里我们配置一下 px2rem
老规矩 引入对应的依赖,这里的依赖是
lib-flexible
px2rem-loader
//命令
npm i lib-flexible px2rem-loader --save-dev
找到目录下面的build->utils.js文件,添加下面三个
exports.cssLoaders = function(options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap,
importLoaders: 1 //在css-loader前应用的loader的数目,默认为0.
//如果不加这个 @import的外部css文件将不能正常转换
//如果不行 请试着调大数字
//更改后必须调大数字 否则无效
}
}
const px2remLoader = {
loader: 'px2rem-loader',
options: {
remUnit: 37.5 //设计稿的1/10 ,我们假设设计稿是350px
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders(loader, loaderOptions) {
// const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
const loaders = options.usePostCSS ? [cssLoader, postcssLoader,] : [cssLoader,px2remLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
这里有个坑,因为项目同时引入了sass和px2rem,而项目会先编译sass,把里面的注释给过滤后,再通过px2rem进行转换,这就会造成原来不想要编译成rem的也会被编译成,/*no*/,/*px*/不生效,而有个写法让PX还是PX.就是不要编译的像素写成大写的,这样就不会被编译,比如px写成PX,不过这样的话,px2rem帮我们转换dpf模式的三套代码就也不生效了,暂时找不到方法,欢迎大家给思路或者有办法可以告诉我
回归正传,写首页的tabbar,配合路由,实现tabbar功能
<template>
<div>
<router-view></router-view>
<div class="tab">
<div class="tab-item" v-for="(item,index) in tab" :key="index">
<router-link :to="item.url">
<img class="icon" :src="item.icon" alt="" >
<p>{{item.title}}</p>
</router-link>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
tab: [
{
icon: require('../../assets/tabbar/home.png'),
icon_select : require('../../assets/tabbar/home_selected.png'),
title: '首页',
url : '/home',
},
{
icon: require('../../assets/tabbar/store.png'),
icon_select : require('../../assets/tabbar/store_selected.png'),
title: '商家',
url : 'store',
},
{
icon: require('../../assets/tabbar/ore.png'),
icon_select : require('../../assets/tabbar/ore_selected.png'),
title: '矿池',
url : 'ore',
},
{
icon: require('../../assets/tabbar/transaction.png'),
icon_select : require('../../assets/tabbar/transaction_selected.png'),
title: '交易',
url : 'transaction',
},
{
icon: require('../../assets/tabbar/mine.png'),
icon_select : require('../../assets/tabbar/mine_selected.png'),
title: '我的',
url : 'mine',
}
]
}
}
}
</script>
<style scoped lang="scss">
.tab {
width: 100vw;
height: 98px;
position: fixed;
bottom: 0;
right: 0;
left: 0;
display: flex;
background: #143258;
.tab-item {
flex: 1;
a{
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
font-size: 20px;
color: #fff;
.icon{
width: 33px;
height: 33px;
margin-bottom: 10px;
}
}
}
}
</style>
这里有个问题要注意 就是图片引入 如果写在data里面必须通过require才可以拿到图片 不然是加载不出来的
剩下的内容就自己去补充和填充,这里就不多介绍了
欢迎大家来补充和纠正