vue技术分享之你可能不知道的7个秘密

2020-06-14 06:13:33易采站长站整理

<BaseIcon name="search"/>
</BaseButton>

三、精简vuex的modules引入

对于vuex,我们输出store如下写:


import auth from './modules/auth'
import posts from './modules/posts'
import comments from './modules/comments'
// ...

export default new Vuex.Store({
modules: {
auth,
posts,
comments,
// ...
}
})

要引入好多modules,然后再注册到Vuex.Store中~~

精简的做法和上面类似,也是运用 require.context()读取文件,代码如下:


import camelCase from 'lodash/camelCase'
const requireModule = require.context('.', false, /.js$/)
const modules = {}
requireModule.keys().forEach(fileName => {
// Don't register this file as a Vuex module
if (fileName === './index.js') return

const moduleName = camelCase(
fileName.replace(/(./|.js)/g, '')
)
modules[moduleName] = {
namespaced: true,
...requireModule(fileName),
}
})
export default modules

这样我们只需如下代码就可以了:


import modules from './modules'
export default new Vuex.Store({
modules
})

四、路由的延迟加载

这一点,关于vue的引入,我之前在 vue项目重构技术要点和总结 中也提及过,可以通过require方式或者import()方式动态加载组件。


{
path: '/admin',
name: 'admin-dashboard',
component:require('@views/admin').default
}

或者


{
path: '/admin',
name: 'admin-dashboard',
component:() => import('@views/admin')
}

加载路由。

五、router key组件刷新

下面这个场景真的是伤透了很多程序员的心…先默认大家用的是Vue-router来实现路由的控制。 假设我们在写一个博客网站,需求是从/post-haorooms/a,跳转到/post-haorooms/b。然后我们惊人的发现,页面跳转后数据竟然没更新?!原因是vue-router”智能地”发现这是同一个组件,然后它就决定要复用这个组件,所以你在created函数里写的方法压根就没执行。通常的解决方案是监听$route的变化来初始化数据,如下:


data() {
return {
loading: false,
error: null,
post: null
}
},
watch: {
'$route': {
handler: 'resetData',
immediate: true
}
},
methods: {
resetData() {
this.loading = false
this.error = null
this.post = null
this.getPost(this.$route.params.id)
},
getPost(id){