Vue 小项目的最佳实践

项目简介
目前一期只是为App内某个模块资讯模块文章的分享和APP下载,后续还会有更多的功能,为了项目可扩展、可伸缩结合了我以前的实践搭建了此项目项目地址,如果这个简单的项目能给您带来帮助请给小哥哥⭐Star好不好(手动笔芯)。
功能
- 根据分享出来的文章ID获取数据
- 在网页内可以打开或者下载该APP
- 微信平台的特殊处理
- 微信平台的屏蔽了scheme,文章页面的打开APP的功能需要出浮窗提示去浏览器中打开
- 下载APP页面在微信中,IOS可以唤起APP Store,安卓则需要提示浮窗
使用技术须知
Vue,VueRouter,Vuex三件套不在多说
Axios
主要用来发起Http请求,想要详细了解具体使用方式和操作指南可以请参考笔者下面的几篇文章
Axios全攻略
Vuex2和Axios的开发
注意:因为Axios使用了Promise,适配低版本浏览器 一定要配合使用es6-promise
Vuex-router-sync
Vuex-router-sync资料
功能:将Router中的 这些数据注入到Store中,方便我们调用。
在此项目中 我用此插件获取URL上的文章ID
Vue-meta
Vue-meta资料
功能:改变网页Head上的一些标签值。
在此项目中,我用此插件改变文章页面上的Title,在浏览器中标题不那么木讷。
Mobi.css
Mobi.css资料
功能:小而精美的手机端CSS布局库
在此项目中,不想用太大的UI框架也不想自己写太多的样式,选择了它。
Vue-infinite-loading
Vue-infinite-loading资料
功能:缓解加载数据时页面空白的尴尬,可自定义loading动画。
关键实现
URL上获取文章ID
和APP的同学商量了我们就用http://xxxx/article/:id的方式去定义分享出去文章地址,页面通过获得URL上的
ID去请求相对应的数据。我是使用Vuex-router-sync直接从Store中获得ID的rootState.route.params.id
// 文件src/modules/action
/** 获取文章信息 */
export const getArticle = ({ rootState, commit }) => {
return new Promise((resolve, reject) => {
axios({
method: 'get',
url: 'share/news_details',
params: {
news_id: rootState.route.params.id
}
})
.then((response) => {
commit(types.ARTICLE, response.data.data)
resolve(response)
})
.catch((error) => {
reject(error)
})
})
}
Store中获取环境区别
在每个页面进行操作时,我们需要鉴别当前系统是IOS或者安卓,每次通过正则去鉴别UA里的字符串太麻烦,所以我将此放到Store中,方便所有的组件使用
// 文件src/modules/store
const state = {
system: (/iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase()) ? 'IOS' : 'Android'),
article: {},
isWeixin: (/MicroMessenger/ig).test(navigator.userAgent)
}
合理的处置异常
我们去加载数据时可能会遇到失败的情况,这里需要对页面有一个良好的处理,这里我主要使用Vue-infinite-loading去实现页面上的效果。
_onInfinite () {
this.getArticle().then(() => {
// 完成之后loading消失
this.$refs.infiniteLoading.$emit('$InfiniteLoading:loaded')
this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete')
})
.catch(() => {
// 异常之后页面的展示 执行下方slot="no-results"部分
this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete')
})
}
<infinite-loading :on-infinite="_onInfinite" ref="infiniteLoading" spinner="bubbles">
<span slot="no-results">好像来到了奇怪的地方~</span>
<span slot="no-more"></span>
</infinite-loading>
keep-alive组件复用
这是一个很能提高页面性能的标签,会将已使用过的不活动的组件缓存起来而不是销毁。在性能不太好的手机上,模版的渲染也是需要一定时间的,我们可以用这个标签将缓存曾经使用过的组件(页面),在此组件激活时刷新里面的数据即可。激活时使用activated这个生命周期
activated
activated () {
this.clearArticle() //激活时先清除Store中的数据 因为$InfiniteLoading是根据页面高度来发起请求的
this.$refs.infiniteLoading.$emit('$InfiniteLoading:reset')
}
组件代码的规范
始终基于模块的方式来构建你的 app,每一个子模块只做一件事情。
Vue.js 的设计初衷就是帮助开发者更好的开发界面模块。一个模块是应用程序中独立的一个部分。
我们需要将我们*.vue文件按照一定的结构组织,使得组件便于理解,主要有以下几点比较重要:
- 导出一个清晰、组织有序的组件,使得代码易于阅读和理解。同时也便于标准化。
- 按首字母排序属性,data, computed, watches 和 methods 使得属性便于查找。
- 合理组织,使得组件易于阅读。(name; extends; props, data and computed; components; watch and methods; lifecycle methods, 等.);
- 使用 name 属性。借助于vue devtools可以让你更方便的测试
- 合理的 CSS 结构,如 BEM 或 rscss - 详情?;
- 使用单文件 .vue 文件格式来组件代码
同时配合ESLint将代码写的更加规范和阅读,我这边使用Standard的风格,在VScode中也开启了Standard的验证。
ESLint官网
JavaScript 代码规范-Standard风格
组件规范也可以参考笔者这篇:Vue.js 组件编码规范
最后
看起来此项目简单,实则上用了不少插件去实现需要较强的动手(第三方坑也多,选择一个好的插件得先去github上看看,作者的代码质量),需要保持一定的弹性方便日后的扩展也要避免过度的设计。大家若想要加速自己的开发速度,可以多逛逛Vue awesome上看看大多数都是高质量的插件,其实很多轮子都有人造好了,选取好的直接拿来用岂不妙哉?
Vue 小项目的最佳实践的更多相关文章
- vue.js+boostrap最佳实践
一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变 ...
- vue项目缓存最佳实践
需求 在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要 ...
- Vue异步请求最佳实践
一.当前存在的问题 目前项目前端请求后台数据的方式是这样的: 页面中method中dispatch到action action调用mutation,请求axios 请求到数据后存储到state中 页面 ...
- Vue 工程化最佳实践
目录结构 总览 api 目录用于存放 api 请求,文件名与模型名称基本一致,文件名使用小驼峰,方法名称与后端 restful 控制器一致. enums 目录存放 常量,与后端的常量目录对应 ...
- Vue中CSS模块化最佳实践
Vue风格指南中介绍了单文件组件中的Style是必须要有作用域的,否则组件之间可能相互影响,造成难以调试. 在Vue Loader Scope CSS和Vue Loader CSS Modules两节 ...
- Vue.js最佳实践
Vue.js最佳实践 第一招:化繁为简的Watchers 场景还原: created(){ this.fetchPostList() }, watch: { searchInputValue(){ t ...
- Vue.js最佳实践--给大量子孙组件传值(provide/inject)
开发中有个需求,有个Parent组件(例如div)下,输入框,下拉框,radiobutton等可编辑的子孙组件几百个,根据某个值统一控制Parent下面的所有控件的disabled状态 类似于这样,给 ...
- vue 单文件组件最佳实践
vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...
- [转] iOS开发者的Weex伪最佳实践指北
[From] http://www.cocoachina.com/ios/20170601/19404.html 引子 这篇文章是笔者近期关于Weex在iOS端的一些研究和实践心得,和大家一起分享分享 ...
随机推荐
- vsftp 服务的启动与问题
一般系统用户是可以直接登入的如果不可以可能是selinux的原因 执行一下: 更改selinux的配置文件将其设为disable,可我不想重启服务器,有以下解决办法:执行命令:setenforce 0 ...
- 【bzoj4551】TJOI2016&HEOI2016树
这题嘛…… 子树询问什么的,直接dfs序线段树无脑写,是吧…… 然后几分钟之内zcy就写出了这样的东西: #include<bits/stdc++.h> #define N 100005 ...
- web优化的方法
缓存(减小对服务器.数据库的压力) 生成静态页面(区别于缓存,数据量太大用“缓存”不利) URL重写(SEO,搜索引擎的优化) ajax的优化(SEO) <meta content=“” nam ...
- debian下没有公钥解决办法
debian下没有公钥解决办法 执行命令:apt-get update 出现如下错误 正在读取软件包列表... 完成 W: 以下 ID 的密钥没有可用的公钥: 8B48AD6246925 ...
- DevExpress控件-GridControl根据条件改变单元格(Dev GridControl 单元格着色)
DevExpress控件-GridControl根据条件改变单元格颜色,如下图: 解决办法:可以参考:http://www.cnblogs.com/zeroone/p/4311191.html 第一步 ...
- hdu 1044(bfs+dfs+剪枝)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- CSAPP lab1 datalab-handout(深入了解计算机系统 实验一)
主要涉及计算机中数的表示法: (1)整数: two's complement,即补码表示法 假设用N位bit表示整数w: 其中最左边一位为符号位,符号位为0,表示正数,为1表示负数. (2)浮点数: ...
- (编译)使用 AppCenter 持续输出导出到 Application Insights
原文地址:https://blog.xamarin.com/appcenter-continuous-export-application-insights/ 五星手机应用有一个特殊的特点:他们不会放 ...
- 17-7-27-日常学习react
啊啊啊啊啊啊啊,今天改了一天的css,因为项目是由两个开源项目整合而成,所以CSS合并的时候,超级超级奇怪,就一直在调.不过也学会了怎么调css.之前觉得css很困难,不过调了一天,感觉还好,就是自己 ...
- 17-7-26-react-router入门
完蛋了,上司最近都和颜悦色的,搞得我跑路的决心大大减退,不过还是要跑路.毕竟面向工资编程.今天一天基本都在挑项目的CSS,由于是别人哪里直接copy的,然后css我也直接copy的codepen上的源 ...