最近俩月正好用 vue 作了一个大数据的项目,积累了不少心得。今天终于有机会分享出来了。html
vue 提供的模块化无疑是提升开发效率的神器,并且对于后期代码优化和维护也提供的极大地便利。vue
vue 提供了组件功能,组件又能够分为全局组件和非全局组件。区别是全局组件你能够直接在 .vue 文件中直接使用自定义的 html 便可。非全局组件必须在 Vue 的对象中定义 components 引入这个组件ios
import A from '@/component/A'
export default {
data () {},
components: { A }
}
复制代码
// index.js 文件
import A from '@/component/A'
A.install = function (Vue) {
Vue.component(A.name, A)
}
export {
A
}
// main.js 文件
import { A } from './components/index'
Vue.use(A)
复制代码
这里针对引入全局组件有一个优化小技巧,上面的方式引入全局组件须要同时维护 index.js 文件和 main.js 文件很麻烦。采用下面的代码能够只维护 index.js 文件便可ajax
// index.js 文件
import A from '@/component/A'
A.install = function (Vue) {
Vue.component(A.name, A)
}
function InstallAll(Vue) {
Vue.use(A)
}
export {
A,
InstallAll
}
// main.js 文件
import { InstallAll } from './components/index'
InstallAll(Vue)
复制代码
手机号 + 验证码进行登陆已是目前主流的登陆方式之一了。可是一个项目要使用验证码的地方很是多,像登陆、注册、修改密码、信息再次确认的时候都会进行二维码请求。每一个地方重写验证码逻辑很麻烦,因此验证码是须要抽象出来的组件的。vuex
验证码一般会对接多个接口,或者是一个接口可是须要传递获取验证码的类型。而这些接口一般都须要一个手机号。所以验证码须要接收俩个参数:phone, type。自身完成单击操做和读秒操做便可,不须要对引用的地方产生任何影响。npm
// 最后每一个页面调用的时候大概长这个样子
<auth-code :phone="phone" type="1"></auth-code>
复制代码
收藏功能使用的频率要比验证码更高,固然也更难。axios
像我最近作的大数据项目,用户能够对视频、音乐、话题进行收藏。同时他们出现的地方也很是多,像视频列表、音乐列表、话题列表、视频详情、音乐详情、话题详情... ... 都会有收藏的功能,不抽象成一个组件一样的逻辑写好几个地方后期维护是及其困难的。后端
像这种收藏,一般都会须要一个 id,是否收藏状态,以及完成收藏后的一系列的跳转功能。所以须要俩个参数: id 和 status。和 complete 回调方法promise
// 最后每一个页面调用的时候大概长这个样子
<collection :id="id" :status="status" @complete="complete"></collection>
复制代码
我上面提到我会收藏音乐、视频、话题,很显然是三个收藏接口。难道要写三个收藏组件么?固然不是,既然同属于收藏功能,天然是一个组件搞定了。再加一个 type 参数区别一下便可了bash
// 最后每一个页面调用的时候大概长这个样子
<collection :id="id" :status="status" type="video" @complete="complete"></collection>
复制代码
这样每次用到收藏的时候我只须要复制这一行代码就能够了
第三方 UI 库会给咱们引入很是多好用的组件,像轮播图、表单、图片上传。可是这些都是跟业务无关的组件,而咱们在作项目的时候时候确定会碰到大量重复的功能。为了代码的易维护性必定要有良好的组件抽象能力。合理运用好 component 功能。
上面提到的验证码和收藏功能使用次数频繁,我一般都会当作全局组件处理(我的会把使用次数 > 1 的组件当成全局组件),可是有的页面及其复杂,一个页面上万行代码后期查找确定费事巴拉的。也必定要对其进行拆分处理不要一个组件写到尾。针对这种状况我一般都会采用局部组建去维护,提升界面的简洁程度。
数据过滤无疑也是 vue 的重要功能之一。像时间、数字的过滤,实在是太频繁了。掌握 filter 无疑能大大提升代码幸福度和可维护性
同 component 同样 filter 也分为全局过滤器和局部过滤器。
vue.filter('date', function (value1, value2, ...) {
return '处理以后的结果'
})
复制代码
export default {
filters: {
date (value1, value2, ...) {
return '处理以后的结果'
}
}
}
复制代码
// 不带参数
{{value1 | date}}
// 带参数
{{value1 | date(value2, ...)}}
// 多个过滤器
{{value1 | filter1 | filter2}}
复制代码
注意:第一个参数是管道符 (|) 前面的值
我大部分都是使用的全局过滤器。像局部过滤器,一是获取到原始数据的时候能够直接进行处理,二是发现早期使用的局部过滤器都升级为全局过滤器了。若是你有好的局部过滤器场景欢迎评论
上面俩种是我碰到的最多的,也欢迎你评论补充。
该用 filters 的地方千万别手软,超过一处就要写成公共的。不然后期要是逻辑处理的不对,你不知道哪些地方用了相同的处理逻辑很容易形成 bug 漏改的状况。
这个属性也分为全局和局部使用,全局使用了将会对以后的全部组件产生影响。所以我不建议在业务代码中使用全局 mixins。并且感受全局 mixins 使用起来不利于代码维护,你想忽然在 template 中使用了一个一个函数第一想法确定是去 methods 中查找,找不到就很难受了。并且破坏性也比较大,因此我都采用局部注入的方式。让别人知道这里采用了 mixins,要是遇到了一些奇怪的状况,他知道这里有 mixins 就会主动去这里面查看相关代码了。
这个属性我用的最多的是引用第三方的列表库的时候他一般都会有个 formatter 的格式化数据属性。这里 filters 是用不了的。但像列表对于数据的处理重复性是特别多的,所以 注入一个 mixins 就方便多了。
// to: Route: 即将要进入的目标 路由对象
// from: Route: 当前导航正要离开的路由
// next: Function: 必定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
next(): 进行管道中的下一个钩子。若是所有钩子执行完了,则导航的状态就是 confirmed (确认的)。
router.beforeEach((to, form, next) => {})
复制代码
actions: {
getMemberShip ({ state, commit }) {
return new Promise((resolve, reject) => {
if (!state.memberShip) {
// memberShip 为 ajax 请求方法
memberShip(state.userInfo).then(res => {
commit('setMemberShip', res)
resolve(res)
}).catch(err => {
reject(err)
})
} else {
resolve(state.memberShip)
}
})
},
}
复制代码
这个是我定义的一个获取会员套餐的状况,会员套餐不少个页面都会用到。可是他改动次数频繁,并且也不必用户一登陆就去加载,所以使用 action 存起来。若是没有这个值就执行 ajax 请求,若是有就直接返回结果。
echarts 图表界的老大哥了,支持 N 多种图表,配置项说好几千应该没夸大其词吧。不过也正由于繁多的配置项才给了你更多的自由配置的可能。那用 echarts 有什么技巧呢?
echarts 包含标题、图例、提示框、标注、标线... ... 等控件,调整个样式真的很差找。可是如今官方新加入了一个术语速查手册,以前我都是去旧官方上查,如今新官方上有了这个东西但是有福了。我须要调整那个控件的效果在上面一点就带我到相应的 API 简直是好用到飞起。
axios 是相似于 ajax 的的第三方控件。因此这个我也是蛮有想法跟你们交流的。
// 步骤1
npm install --save babel-polyfill
// 步骤2 在 vue.config.js 文件中加入如下内容
module.exports = {
configureWebpack: config => {
return {
entry: {
app:['babel-polyfill', './src/main.js']
}
}
}
}
复制代码
原本还想在酝酿酝酿,不过近期发如今不总结一下本身就快渐渐的忘记了,其中还有不少东西没写出来,像项目优化技巧,指令系统。可是这篇文字已经很长了。因此只能到这里了,若是你以为对你有用欢迎点赞,若是你想跟我交流得到指导欢迎关注公众号加我微信进行探讨。