跳到主要内容

Vue 求知书场项目实例 (上)

· 阅读需 6 分钟
Yancy Qi
Front End Engineer

Vue 前端框架基础课练习

一、 学习目标​

img

二、 项目展示​

img img

img img

三、 项目结构​

img

四、 技术方案​

  1. 使用 Vue 作为前端开发框架

  2. 使用 Vue CLI 脚手架搭建项目

  3. 使用 Vant 作为移动端组件库

  4. 使用 Axios 作为 HTTP 库和后端 API 交互

  5. Mockjs 模拟后端 API 提供数据

  6. 使用 Vue-Router 实现前端路由的定义及跳转、参数的传递等

  7. 使用 Vuex 进行数据状态管理,实现购物车的状态存储

五、 项目搭建​

1)安装 Node.js。

2)安装 Vue CLI 脚手架。 npm install vue-cli -g

3)创建并运行项目。

目录结构:

  1. public:存放公共文件
  2. src:源代码目录,保存开发人员编写的项目源码
  3. src\assets:资源文件目录,如图片、css 等
  4. src\components:组件文件目录
  5. src\lib:存放 css、js、fonts 资源
  6. src\plugins:插件目录,存放 axios.js 文件
  • 注:

    • index.html:入口 html 文件
    • src\App.vue:项目的 Vue 根组件,所有页面在其中切换
    • src\main.js:项目的入口文件
    • src\router.js:路由文件
    • 将 components/HelloWorld.vue 删除
    • App.vue 中多余代码删除
    • router/index.js 中多余代码删除

六、 Single Page Application(SPA)​

单页面应用:页面由组件构成。项目的网址不变,只有网页内容(组件)切换。

优点:

  1. 良好的交互体验

  不需要重新加载整个页面,没有页面之间的切换,不会出现 “闪烁”现象,页面显示流畅。

  1. 前后端工作分离模式

  后端不再负责模板渲染、输出页面工作,后端API通用化,

  1. 减轻服务器压力

SPA:在前后端分离基础上加一层前端路由,整个网站只有一个 html 页面

图中,index.html 后面的 “#/home” 是 hash 方式的路由,由前端路由来处理,将 hash 值与页面中的组件对应,当 hash 值为 “#/home” 时,就显示 “首页” 组件。

前端路由在访问一个新页面的时候仅仅是变换了一下 hash 值而已,没有和服务端交互,所以不存在网络延迟,提升了用户体验。

img

七、 前端路由​

**路由:**根据不同的URL展示不同的页面,即输入网址,切换网页。一般由服务器端完成。

**前端路由:**不经过服务器端,直接在前端切换内容(组件)。router 插件实现。

main.js 中引入路由

import router from './router'

new Vue({

el: '#app',

router,

})

创建路由组件:新建 Home.vue、User.vue、Category.vue、Shopcart.vue 文件

命名规范:属于 组件或类的,统一使用大写字母开头

index.js 中路由,实现页面切换:


首页Home.vue :

import Home from '@/components/Home'
{ path: '/', name: 'Home', component: Home, },

用户页User.vue :

import User from '@/components/User'
{ path: '/User', name: 'User', component: User, },

八、 组件切换​

App.vue:引入 Home.vue 组件

<router-view/> :代表路由中的组件,根据路由切换

路由切换时,切换的是 <router-view/> 挂载的组件,其他内容不改变

动画切换​

App.vue:引入 Home.vue 组件

<transition name="fade" mode="out-in">
<router-view/>
</transition>

九、 首页页面结构​

顶部: 标题栏 AppHeader.vue

中部: 轮播 HomeSwipe.vue

中部: 九宫格 HomeGridNine.vue

底部: 导航栏 AppTabBar.vue

十、 vant前端组件库​

网址: https://youzan.github.io/vant/#/zh-CN/home

安装:npm i vant -S

在 main.js 引入 vant 框架:

import Vant from 'vant';

import 'vant/lib/index.css';

Vue.use(Vant);

十一、 底部导航栏​

组件网址: https://youzan.github.io/vant/#/zh-CN/tabbar

思路:

  • 使用组件库中组件封装成自己的组件,文件:AppTabBar.vue
  • 在 App.vue 中使用组件 AppTabBar.vue

实现:AppTabBar.vue

引入:App.vue

import apptabbar from './components/part/AppTabBar.vue'

十二、 顶部标题栏​

组件网址:https://youzan.github.io/vant/#/zh-CN/nav-bar

思路:

  • 使用组件库中组件封装成自己的组件 AppHeader.vue
  • 在 App.vue 中使用组件 AppHeader.vue

AppHeader.vue

  • template
    • title
    • { path: '/', name: 'Home', component: Home, meta:{title:'求知书屋',}, },
  • style
    • .van-nav-bar:注意命名规则与组件对应

返回箭头:后退

onClickLeft() {
this.$router.go(-1)
},

搜索:切换组件

onClickRight() {
this.$router.push("/Category");
},

App.vue 引入:

import appheader from './components/part/AppHeader.vue'

十三、 轮播图​

组件网址: https://youzan.github.io/vant/#/zh-CN/swipe

思路:

  • 使用组件库中组件封装成自己的组件,文件: HomeSwipe.vue
  • 在 Home.vue 中使用组件 HomeSwipe.vue

图片数据:["s1.jpg","s2.jpg","s3.jpg","s4.jpg","s5.jpg","s6.jpg"]

图片数据哪里来?服务端。Vue.js并未提供与服务器通信的接口,

  • axios:向服务器端发出请求,是一个基于 promise的HTTP客户端。
  • mockjs:模拟服务器端数据响应(后台和前台一般同时开发,真实对象在调试期间的代替品,生成假数据)

mockjs​

  • 安装命令:npm install - -save mockjs
  • 新建文件夹、文件:mock/mock.js
  • main.js中引入文件:import Mock from './mock/mock.js'
Mock.mock('/swipe', /post|get/i, {
'swipeList':["s1.jpg","s2.jpg","s3.jpg","s4.jpg","s5.jpg","s6.jpg"],
})
// /post|get/i 匹配post和get模式 也可以用'post'或'get'

axios​

  • npm install - -save axios vue-axios

  • 引用:main.js

  • import axios from 'axios';
    import VueAxios from 'vue-axios';
    Vue.use(VueAxios, axios);

axios 请求轮播图片数据: mounted 中实现

this.axios.post("/swipe").then( (res) => {
this.list=res.data.swipeList;
}).catch( (error) => { console.log(error); });

mock响应数据:

Mock.mock('/swipe', /post|get/i, {
'swipeList':["s1.jpg","s2.jpg","s3.jpg","s4.jpg","s5.jpg","s6.jpg"],
})

HomeSwipe.vue 编写:

  • template

    • 图片地址写法:

    • <img :src="require('../../assets/images/swipe/'+item)" />
  • data

  • style

Home.vue中引入:

import homeswipe from './part/HomeSwipe.vue'

十四、 九宫格​

组件网址: https://youzan.github.io/vant/#/zh-CN/grid

思路:

  • 使用组件库中组件封装成自己的组件,文件: HomeGridNine.vue
  • 在 Home.vue 中使用组件 HomeGridNine.vue

axios 请求九宫格中内容数据: mounted 中实现

this.axios.post("/**grid9**").then( (res) => {

this.list=res.data.gridList;

}).catch( (error) => { console.log(error); } );

mock 响应数据:

Mock.mock('/**grid9**', /post|get/i, {

'gridList':[

{id:"/Category", pic:"menu1.png", title:"新闻资讯"},

{id:"/Category", pic:"menu2.png", title:"图片分享"},

{id:"/Category", pic:"menu3.png", title:"商品购买"},

],

})

HomeGridNine.vue

  • template
  • style

Home.vue

  • import homegridnine from './part/HomeGridNine.vue'