好久没更新过Vue的小文章,上次做了一个基于Vue+Mint-ui的移动端AppDemo,集成了推送功能,然后通过cordova打包生成apk,移动端表现还不错,今天把这个小东西分享出来,希望有更多的小伙伴能够用Vue去做一些有意思的东西,本人才疏学浅,有说的不对的地方,还请大家多多指教。下面按照惯例放上demo地址和源码地址,希望大家能给我点下star:
Demo(进去需要先注册才能登录,用的localstorage,随便写符合格式的就行)
Demo基于Vue2源码
Demo基于Vue1的源码

搭建项目

项目结构

本项目才用Vue-cli脚手架自动生成,这是一个Vue生态系统中一个伟大创举。这意味着我们不需要手动构建我们的项目,而它就可以很快地为我们生成。下图是一个完整的项目结构,如图所示:

  • components:包含所有的页面组件

  • vuex:包含vuex相关文件

  • modules:存放每个页面单独的state和mutation

  • static:静态文件存放(图片和图标库等)

  • index.html:渲染的页面

  • main.js:应用入口点,包含根实例

  • App.vue:主页面组件

项目流程:

  • 安装Vue-cli(要有node与npm)

npm i -g vue-cli
  • 创建一个webpack项目,并且下载依赖

vue init webpack vue-demo-orderApp
cd vue-demo-orderApp
npm i
  • 安装Vue-router,Vuex和Mint-ui

npm install vue-router vuex --save
npm install mint-ui --save
  • 热加载打开页面(生产的时候运行npm run build)

npm run dev

项目的框架已经搭建好了,接下来就是为项目添砖加瓦。

页面结构分析

--
本项目为一个demo项目,主要为了练习vue2的使用,结构上借鉴了官方的写法,界面为通用的app样式,才用饿了么团队的Mint-Ui的制作。
这个demo的每一个页面都是一个.vue文件,利用Vue的单文件组件,非常便于管理每个页面的状态,样式和数据,首页主要是展示页,和操作面板页。下面是主页的代码:

<template><div class="index-container"><!-- 轮播图部分 --><mt-swipe :auto="4000"><mt-swipe-item><div class="banner1 banner" style="background:url('./static/banner1.jpg');background-size: cover;"></div></mt-swipe-item><mt-swipe-item><div class="banner2 banner" style="background:url('./static/banner2.jpg');background-size: cover;"></div></mt-swipe-item></mt-swipe><!-- 订单同步状态部分 --><mt-popupclass="status" v-model="popupVisible"popup-transition="popup-fade"position="top">同步{{ orders_status }}</mt-popup><!-- 首页功能栏部分 --><ul class="icon-list"><li class="icon"><router-link to="order" class="iconlink"></router-link><img src="../assets/scan.png" class="clear"><h4>订单管理</h4><p>扫描盘点,手工盘点</p><i></i></li><li class="icon"><router-link to="goods" class="iconlink"></router-link><img src="../assets/ana.png" class="clear"><h4>渠道管理</h4><p>扫描盘点,手工盘点</p><i></i></li><li class="icon"><router-link to="order" class="iconlink"></router-link><img src="../assets/store.png" class="clear"><h4>订单发布</h4><p>扫描盘点,手工盘点</p><i></i></li><li class="icon" @click="getOrders()"><router-link to="test" class="iconlink"></router-link><img src="../assets/goods.png" class="clear"><h4>订单同步</h4><p>快速同步渠道订单,方便快捷</p><i></i></li><li class="icon"><router-link to="personinfo" class="iconlink"></router-link><img src="../assets/download.png" class="clear"><h4>个人中心</h4><p>信息管理,logo更换</p><i></i></li>                     </ul></div>
</template>
<script type="text/javascript">import { MessageBox } from 'mint-ui'import { mapState } from 'vuex'export default{created:function(){if(window.localStorage.user == null){this.$router.push({path: '/login'})}},data(){let popupVisible = falselet orders_statusreturn {popupVisible, orders_status}},computed:mapState({orders_status: state => state.news.orders_status,}),methods:{getOrders: function(){const that = thisthis.$store.dispatch('synchroOrder', this).then(function(){that.popupVisible = true})}}}
</script>

先看代码部分Vue2相比Vue1相比还是变化很多的,首先就是计算属性比以前更好用了,其次是生命周期部分和以前相比变化很大,这点要注意下。其次是Vue2更推崇ES6的写法,并且支持了promise,这是非常好的地方,而且官方的迭代文档也写的很全,基本上很容易从1迭代到2。并且Vue2不再支持双向绑定(sync)这个方法了,它使用了一种更好的方式来进行父子组件之间的通信(emit),这样子组件就不会影响到父组件的状态。下面我放出这个主页Vue1的代码,大家可以比较一下:

<template><div class="index-container"><mt-swipe :auto="4000"><mt-swipe-item><div class="banner1 banner" style="background:url('./static/banner1.jpg');background-size: cover;"></div></mt-swipe-item><mt-swipe-item><div class="banner2 banner" style="background:url('./static/banner2.jpg');background-size: cover;"></div></mt-swipe-item></mt-swipe><ul class="icon-list"><li class="icon"><img src="../assets/scan.png" class="clear"><h4>订单管理</h4><p>扫描盘点,手工盘点</p><i></i></li><li class="icon"><img src="../assets/ana.png" class="clear"><h4>渠道管理</h4><p>扫描盘点,手工盘点</p><i></i></li><li class="icon"><img src="../assets/store.png" class="clear"><h4>订单发布</h4><p>扫描盘点,手工盘点</p><i></i></li><li class="icon" @click="getOrders(this)"><img src="../assets/goods.png" class="clear"><h4>订单同步</h4><p>快速同步渠道订单,方便快捷</p><i></i></li><li class="icon"><img src="../assets/download.png" class="clear"><h4>个人中心</h4><p>信息管理,logo更换</p><i></i></li>                     </ul><mt-popup:visible.sync="popupVisible"popup-transition="popup-fade"position="top">同步成功</mt-popup></div>
</template>
<script type="text/javascript">import { synchroOrder } from '../vuex/action'import { MessageBox } from 'mint-ui'export default{init:function(){if(window.localStorage.user == null){//window.location.href = window.location.origin + window.location.pathname + '#!/login'console.log('请登录')this.$router.go({path:'/login'})}},data(){let popupVisible = falsereturn {popupVisible}},vuex:{getters:{order_status: state => state.orders_status},actions:{synchroOrder}},methods:{getOrders: function(that){this.synchroOrder(that)if(this.order_status){this.popupVisible = !this.popupVisible}}}}

上面的代码比较可以看出,VueX和Vue-router的变化也很大,这里我就详细说这两者的变化了,有啥问题可以讨论讨论,大概说下,首先是Vue-router部分,不再支持以前V-link的这种方式了,变为采用router-link这种方式。VueX方面我感觉变化最大的就是写法和以前不一样了。Vuex才用this.$store.dispatch('xxx')来派发一个action,通过commit委托给mutation来执行相应的操作,并且支持异步的写法,就是ES6的promise,给一段官方的异步写法:

actions: {actionA ({ commit }) {return new Promise((resolve, reject) => {setTimeout(() => {commit('someMutation')resolve()}, 1000)})}
}

。还有一个明显的变化是mapActions和mapState属性,mapActions可以用来指明一个组件的方法去调用store.dispatch()方法。通过mapState属性我们可以去定义一些计算函数和键值对,主要是为了方便运用多个states属性和getters。还有一个比较大的变化就是Vuex2可以支持将store转变为Module的写法,来更细致的去管理状态。我的这个小demo也用上了这个新特性,它能让大型的页面也能有很好的状态管理。
可以对比一下同一个项目基于Vue1和Vue2的写法。这样更能够直观的去了解到不同之处,并且可以去细想一下作者为什么这个改,这对我们编程思想的提示是很有帮助的。

基于模块化的Vuex

将不同的Vuex状态放在对应的页面状态模块里,这样当需要管理的数据很多的时候也能从容的应对。
可以看下这里面是怎么写的,下面是news.js里面的:

import * as types from '../mutation-types'const state = {news:{},orders_status: '成功',selected:'首页'
}const mutations = {[types.SYNCHRO_ORDER](state, items){state.news = itemsconsole.log(state.news.length)if(state.news.length != 0){state.orders_status = '成功'}else{state.orders_status = '失败'}},[types.CHANGE_SELECTED](state, item){state.selected = item}
}export default{state,mutations
}

下面是mution-types.js

export const CHANGE_ORDER = 'CHANGE_ORDER'
export const CHANGE_STATUS = 'CHANGE_STATUS'
export const DISPLAY_STATUS = 'DISPLAY_STATUS'
export const CHANGE_PERSON = 'CHANGE_PERSON'
export const SYNCHRO_ORDER = 'SYNCHRO_ORDER'
export const CHANGE_POP = 'CHANGE_POP'
export const CHANGE_SELECTED = 'CHANGE_SELECTED'

可以看到我们将所有的mutaions方法都放在了mution-types里面进行统一的管理,然后再对应的模块里面来处理这些方法,在不同的模块里面我们只能操作对应模块的数据和状态,这对于状态管理来说简直是非常完美。

基于Vue2全家桶的移动端AppDEMO实现相关推荐

  1. vue音乐笔记_基于vue全家桶的移动端音乐web app

    项目描述 这是一个基于 Vue2.x 和网易云音乐 API制作的移动端 web app 项目:由于是出于练习和实验的目的,因此并非是网易云音乐 app 的替代品,目前也没有涵盖全部的功能: 该项目主要 ...

  2. 基于vue2全家桶开发的匿名朋友圈及聊天应用

    前言 学习了vue全家桶后一直想找个机会来写一个完整一点的项目,这次学校举办的比赛就是一个很好的契机.由于是自己瞎搞搞,所以写起来比较随心所欲,没有过多地从设计和产品的角度去思考.这个项目包括了图片上 ...

  3. Vue2全家桶+Element搭建的PC端在线音乐网站

    目录 1,前言 2,已有功能 3,使用 4,目录结构 5,页面效果 1,前言 项目基于Vue2全家桶及网易云音乐 Node Api实现,网站风格简约清新,体验比较流畅. 下载地址:https://gi ...

  4. 基于Vue全家桶制作的的高仿美团APP

    美团外卖APP ? 项目演示地址:http://39.108.232.27:9000 ? GitHub:github.com/bxm0927/vue- 基于 Vue 全家桶 (2.x) 制作的美团外卖 ...

  5. music功能 vue_Vue 全家桶实现移动端酷狗音乐功能

    Vue 已经用了不少时间,最近抽空把以前的未完成的酷狗音乐做完了,过来分享下,也可以直接点这里预览,注意切换成手机模式. 技术栈: vue-router.eventBus.vuex.vue-aweso ...

  6. 基于vue2 + Muse-ui 开发的移动端轻社区项目 F-Rent

    本项目(友租)是基于Vue2.Vuex.Muse-UI.es6.webpack构建的一个移动端轻社区 在做初型时由于没有UI设计稿和原型图,想到一部分做一部分 所以初版采用了Muse-UI框架先完成大 ...

  7. 基于React全家桶开发「网易云音乐PC」项目实战(一)

    网易云音乐PC项目实战 项目简介 1.项目介绍 项目使用到的技术栈 CSS使用Flex进行布局 配置路径别名使用: carco 项目路由使用: react-router来管理 使用react-rout ...

  8. Vue2全家桶之一:vue-cli(vue脚手架)超详细教程

    vue.js有著名的全家桶系列,包含了vue-router,vuex, vue-resource,再加上构建工具vue-cli,就是一个完整的vue项目的核心构成 vue-cli这个构建工具大大降低了 ...

  9. 基于Vue 全家桶实现网易云音乐 WebApp

    基于 Vue(2.5) + vuex + vue-router + vue-axios +better-scroll + Scss + ES6 等开发一款移动端音乐 WebApp,UI 界面参考了安卓 ...

最新文章

  1. 第二十一课.GBDT
  2. DataReader和DataSet区别
  3. 计算机考研英语词汇书,求助:有知道电脑背考研英语单词的
  4. 2018数学建模A题的简单指导
  5. 大数据面试-04-大数据工程师面试题
  6. iSPRINT:Google 最高能的创新加速课程,绝不允许产品走弯路!
  7. sqlserver2014导出mysql_sql server2014如何备份数据库-sql server2014备份数据库教程 - 河东软件园...
  8. ****** 三十 ******、软设笔记【计算机体系结构】-循环冗余校验码(CRC)
  9. Keil5(C51,MDK)注册详细教程(2032年版本)
  10. 《机器人动力学与控制》第九章——动力学 9.2 动能与势能的一般表达
  11. 能否用一种语言来培养编程思维以及养成世界观
  12. 硬件设计4---什么是电感磁珠?
  13. 华为交换机查看本机mac地址命令
  14. MySQL存储过程中利用do while循环实现将行与行具有层级关系(联系)的行值检索出来
  15. JavaScript中查找指定字符串的几种方式
  16. Android实现计时器(Handle+Runable)
  17. 教你安装各种应用环境-Nodejs
  18. 从项目管理角度看马谡失街亭
  19. 关于解决win7远程桌面已停止工作错误
  20. rust的actix web框架试试手(json数据传输和接受,数据库操作,rust后端操作)

热门文章

  1. 超神学院中的引擎是生物计算机吗,超神学院:雄芯和乾坤就像一台计算机,前者是操作平台后者是CPU...
  2. IBM 笔记本电脑随机启动项(可根据个人需要进行删减)
  3. 软件工程创造力的重要性
  4. 《计算机组装与维修作业》答案,《计算机组装与维修作业.docx
  5. STM32之待机唤醒
  6. wpf 点击按钮弹出新对话框_wpf弹出输入对话框
  7. js之appendChild、insertBefore和insertAfter
  8. 5、python—元组
  9. Android事件分发完全解析之事件从何而来
  10. 计算机网络工程实用教程(第3版)石炎生 郭观七 编著 复习资料 聊城大学计算机学院考试科目