项目--1
1、回顾
- 全局注册组件,局部注册组件
- 组件模板、定义组件、注册组件、使用组件
- 组件间传值
- 动态组件、keep-alive
- cnpm i @vue/cli@3 -g
- vue create myapp
2、熟悉vue项目目录结构
-node-modules 依赖文件
-public 基本文件,包含页面,图片,小图标
-src 项目主场
-tests 测试
.editorconfig 编辑器配置文件
.gitignore git忽略文件
babel.config.js babel配置文件
cypress.json 插件
package.json 描述文件
3、src 目录结构
-assets 静态资源文件
-components 自定义的组件
-router 路由文件
-store 状态管理器
-views 页面㢟
App.vue 入口页面结构
main.js 入口文件
4、运行项目
cnpm run serve
.vue 文件 --- vue的单文件组件,内含组件的结构、组件的逻辑、组件的样式
4.1 修改App.vue的页面结构
<template>
<div class="container">
<div class="box">
<header class="header">头部</header>
<div class="content">内容</div>
</div>
<footer class="footer">底部</footer>
</div>
</template>
4.2 添加页面的基本样式 App.vue
- 复制lib文件至自己的项目的src --- 来源于 去哪网网的项目
<style lang="scss">
@import '@/lib/reset.scss'; // 引入重置样式,@表示的就是src目录
html, body, .container {
@include rect(100%, 100%); // width: 100%;height: 100%;
}
.container {
// 建议使用弹性盒布局
@include flexbox(); // display: -webkit-box;display: -ms-flexbox;display: flex;
@include flex-direction(column); // -webkit-box-orient: vertical;-webkit-box-direction: normal;-ms-flex-direction: column;flex-direction: column;
.box {
@include flex(); // -webkit-box-flex: 1;-ms-flex: 1;flex: 1;width: .1px;
@include rect(100%, auto);
@include flexbox();
@include flex-direction(column);
.header {
@include rect(100%, 0.44rem);
@include background-color(#f66);
}
.content {
@include flex();
@include rect(100%, auto);
@include overflow(); // overflow: auto;-webkit-overflow-scrolling: touch;
}
}
.footer {
@include rect(100%, 0.5rem);
@include background-color(#efefef);
}
}
</style>
4.3 编写底部选项卡以及样式
<footer class="footer">
<ul>
<li>
<span></span>
<p>首页</p>
</li>
<li>
<span></span>
<p>分类</p>
</li>
<li>
<span></span>
<p>购物车</p>
</li>
<li>
<span></span>
<p>我的</p>
</li>
</ul>
</footer>
.footer {
@include rect(100%, 0.5rem);
@include background-color(#efefef);
ul {
@include rect(100%, 100%);
@include flexbox();
li{
@include flex();
@include rect(auto, 100%);
@include flexbox(); // 一下几句实现的是元素的水平垂直居中
@include flex-direction(column);
@include justify-content(); // -webkit-box-pack: center;-ms-flex-pack: center;justify-content: center;
@include align-items(); // -webkit-box-align: center; -ms-flex-align: center; align-items: center;
}
}
}
5、路由
地址输入栏不同,显示不同的页面
5.1 先创建各个页面 src/views
- home/index.vue
- kind/index.vue
- cart/index.vue
- user/index.vue
以 home/index.vue 为例,复制App.vue文件中的 头部和内容区域的代码
<template>
<div class="box">
<header class="header">首页头部</header>
<div class="content">首页内容</div>
</div>
</template>
5.2 配置路由文件 router/index.js
const routes = [
{ // 路由跟组件时映射关系
path: '/home',
name: 'home',
// 路由的懒加载
component: () => import('@/views/home/index.vue')
},
{
path: '/kind',
name: 'kind',
component: () => import('@/views/kind/index.vue')
},
{
path: '/cart',
name: 'cart',
component: () => import('@/views/cart/index.vue')
},
{
path: '/user',
name: 'user',
component: () => import('@/views/user/index.vue')
}
]
5.3 使路由文件生效
- App.vue部分把 原先的 头部和内容区域的代码删除,使用
代替
<!-- <div class="box">
<header class="header">头部</header>
<div class="content">内容</div>
</div> -->
<router-view></router-view>
router-view 如果路由是 /home,此处就为首页的组件
浏览器输入 /home /kind /cart /user 查看效果
5.4 路由的重定向 ---- 什么都不输入,默认显示首页
- 修改 router/index.js,添加重定向,在配置文件的开始添加
const routes = [
{ // 开始添加重定向
path: '/',
redirect: '/home'
},
{ // 路由跟组件时映射关系
path: '/home',
name: 'home',
// 路由的懒加载
component: () => import('@/views/home/index.vue')
},
....
]
5.5 点击切换路由,路由映射页面 ---- 点击切换路由,路由映射页面
- 修改App.vue, 添加点击链接
- vue 独有的语法 tag="" ---- 生成目标标签,默认生成 a 标签
<footer class="footer">
<ul>
<router-link to="/home" tag="li">
<span></span>
<p>首页</p>
</router-link>
<router-link to="/kind" tag="li">
<span></span>
<p>分类</p>
</router-link>
<router-link to="/cart" tag="li">
<span></span>
<p>购物车</p>
</router-link>
<router-link to="/user" tag="li">
<span></span>
<p>我的</p>
</router-link>
</ul>
</footer>
5.6 设定选中的样式
- App.vue中给底部的li添加选中的样式
li{
@include flex();
@include rect(auto, 100%);
@include flexbox(); // 一下几句实现的是元素的水平垂直居中
@include flex-direction(column);
@include justify-content(); // -webkit-box-pack: center;-ms-flex-pack: center;justify-content: center;
@include align-items(); // -webkit-box-align: center; -ms-flex-align: center; align-items: center;
&.router-link-active { // 审查元素得知选中的样式
@include color(#f66);
}
}
5.7 页面底部放置小图标
- 选图标,加购物车,添加至项目 -》font-class -》复制链接
- public/index.html 引入css文件
<title>myapp</title>
<link rel="stylesheet" href="//at.alicdn.com/t/font_1476238_m5fuchmwska.css">
在 App.vue 中添加图标
<footer class="footer">
<ul>
<router-link to="/home" tag="li">
<span class="iconfont icon-fonts-shouye"></span>
<p>首页</p>
</router-link>
<router-link to="/kind" tag="li">
<span class="iconfont icon-icon"></span>
<p>分类</p>
</router-link>
<router-link to="/cart" tag="li">
<span class="iconfont icon-gouwuche"></span>
<p>购物车</p>
</router-link>
<router-link to="/user" tag="li">
<span class="iconfont icon-wode"></span>
<p>我的</p>
</router-link>
</ul>
</footer>
- 修改 底部的图标和字体样式
li{
@include flex();
@include rect(auto, 100%);
@include flexbox(); // 一下几句实现的是元素的水平垂直居中
@include flex-direction(column);
@include justify-content(); // -webkit-box-pack: center;-ms-flex-pack: center;justify-content: center;
@include align-items(); // -webkit-box-align: center; -ms-flex-align: center; align-items: center;
&.router-link-active {
@include color(#f66);
}
span {
@include font-size(0.24rem);
}
p {
@include font-size(0.12rem);
@include margin(-5px 0 0);
}
}
6、首页面添加 产品的列表
可能多出会使用到,建议封装为 组件
6.1 components/Prolist.vue ---- 组件首字母大写
<template>
<ul class="prolist">
<li class="proitem">
<div class="itemimg">
<img src="" alt="">
</div>
<div class="iteminfo">
<h2>标题</h2>
</div>
</li>
</ul>
</template>
6.2 首页面引入这个 列表组件,注册组件、使用组件 views/home/index.vue
es6的模块化
暴露 export default {}
引入 import MO from './sss'
<template>
<div class="box">
<header class="header">首页头部</header>
<div class="content">
<!-- 使用组件 -->
<Prolist />
</div>
</div>
</template>
<script>
// 引入列表的组件 ---- es6中的模块化
import Prolist from '@/components/Prolist.vue'
export default {
// 注册组件
components: {
// Prolist: Prolist
Prolist
}
}
</script>
6.3 设置列表的样式
<style lang="scss">
@import '@/lib/reset.scss';
.prolist {
@include rect(100%, auto);
.proitem {
@include rect(100%, 1rem);
@include border(0 0 1px 0, #efefef, solid); // 设定的是一个物理像素
@include flexbox();
.itemimg {
@include rect(1rem, 1rem);
img {
@include rect(0.9rem, 0.9rem);
@include border(1px, #f66, solid);
@include margin(0.05rem);
@include display(block);
}
}
.iteminfo {
@include flex();
}
}
}
</style>
7、数据请求
cnpm i axios -S
7.1 首页面请求数据,传递值给子组件,子组件负责渲染
<script>
import axios from 'axios'
// 引入列表的组件 ---- es6中的模块化
import Prolist from '@/components/Prolist.vue'
export default {
// 注册组件
components: {
// Prolist: Prolist
Prolist
},
data () {
return {
prolist: []
}
},
created () {
axios.get('https://47.103.82.2/douban').then(res => {
this.prolist = res.data
})
}
}
</script>
<Prolist :prolist="prolist"/>
Prolist.vue 接收数据并且渲染
<template>
<ul class="prolist">
<li class="proitem" v-for="item of prolist" :key="item.id">
<div class="itemimg">
<img :src="item.images.small" alt="">
</div>
<div class="iteminfo">
<h2>{{ item.title }}</h2>
</div>
</li>
</ul>
</template>
<script>
export default {
props: ['prolist']
}
</script>
public/index.html 添加meta标签
<meta name="referrer" content="no-referrer">
长风破浪会有时,直挂云帆济沧海