对于vue这类mvvm框架来说,其核心就是组件与数据,因此做好相应的数据管理极为重要。这里分享下vuex数据模块化管理的方法,有利于搭建便于维护、协作的vue项目。

vuex管理基本方法和使用

模块化的概念已经在js、css中大量的用到,已不再陌生,其可增加代码的复用、扩展性、维护性等,对于一个大型的系统来说,必不可少。这里也希望提供一种有效的模块化数据管理方式,让协作变的更为高效。

  • 首先看看vuex的四个对象
state: {}, // 存储数据的状态
getters: {}, // 获取vuex数据(state)的统一接口
mutations: {}, // 存vuex数据(state)的统一接口
actions: {}, // vuex内的异步操作接口
  • 再看某种应用方式

项目有两个模块,一个home页面,一个poetry页面,对应不同的vuex数据模块,其vuex的管理方式如下:

// home.js
export default new Vuex.Store({
state: {...},
mutations: {...}
}) // poetry.js
export default new Vuex.Store({
state: {...},
getters: {...}
}) // vuex调用
if (pathname.indexOf('/home') >= 0) {
store = require('/vuex/home').default
} else if (pathname.indexOf('/poetry') >= 0) {
store = require('/vuex/home').default
}

由于每个单页对应会生成一个全新的vuex,这样就会造成vuex数据的丢失(单页跳转、回退时),这就是没有实现vuex的模块化管理及数据共享共享。那么怎么样进行模块化管理呢?

简单的vuex模块化

简单的vuex管理代码如下:

// home.js
...
export default {
state,
getters,
actions,
mutations
} // poetry.js
...
同home.js~~ // index.js
...
import common from './common'
import home from './home'
import poetry from './poetry' Vue.use(Vuex) export default new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {},
modules: {
common,
home,
poetry
}
})
// 调用方法如下
import store from 'src/store/index'

如此,vuex模块化后的结构如下:

图一 vuex模块化的结构

一个独立项目,仅有一处进行new Vuex操作,防止vuex丢失。但上图的方法,可以实现简单项目的管理,在多人协作下仍然存在数据操作隐患。首先来看下重名状态下,各个属性的表现。

方法重名的表现及带来的问题

重名的情况下,state会自动根据模块确认命名空间(独立的属性调用)。再看getters、mutations、actions,其与state不同,会引发重名问题,具体表现如下:

  • getters

    在重名的情况下,仅首先注册的getters会生效,同时报错,提示重名。

    错误如下:

    图二 getters重名报错图

  • mutations/action

    在重名情况下,多个重名方法都将被调用。(以mutations为例)

    this.updateInitInfo('poetry string’)
    
    // home.js
    const mutations = {
    updateInitInfo(state, string) {
    state.initInfo = string
    console.log('home update', string)
    }
    } // poetry.js
    const mutations = {
    updateInitInfo(state, string) {
    state.pageName = string
    console.log('poetry update', string)
    }
    }

    在poetry中调用,执行结果如下:

    图3 mutations的重命名执行结果

由图3,可以得出结论,方法会按序执行,且无报错和警告。

对于这类方法的重名调用,比较难察觉,多人协作时,较容易出现数据共享错误,所以需要用另外的方法来加强配置,使得强调 单一调用 的协作场景,也可以高效的展开。

vuex数据模块化管理方案

vuex自带模块化方法,为namespaced:true。通过对模块进行命名空间设置,就能分模块进行管理。

  • 目录结构

    图4 vuex的目录结构

其中address模块的增加,是为了适应更为复杂的应用需求。相关设置代码如下:

// address/index.js
import addr1 from './addr1'
import addr2 from './addr2'
import addrList from './addrList' export default {
namespaced: true,
modules: {
addr1,
addr2,
addrList
}
} // home.js
const state = {
initInfo: 'hello hity'
}
const getters = {
initInfo(state, getters) {
return state.initInfo
}
}
const actions = {
getInfo({commit, state}) {
commit('updateInitInfo', 'getInfo')
}
}
const mutations = {
updateInitInfo(state, string) {
state.initInfo = string
console.log('home update', string)
}
} export default {
namespaced: true,
state,
getters,
actions,
mutations
} // index.js
......
export default new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {},
modules: {
common,
home,
poetry,
address
}
})

运行结果vuex视图如下:

图5 vuex运行后的结构图

由上图可见,通过命名空间设置的getters、mutaions、actions都可以生成自己独有的方法名,从而实现模块化。这样的方法名,如何调用呢?调用方法有如下几种[以贴出代码的home模块为例]:

// xxx.vue中调用
a、通过store直接调用:
state:this.$store.state.home.initInfo
getters: this.$store.getters['home/initInfo']
mutations: this.$store.commit('home/updateInitInfo', 'set home init info')
actions: this.$store.dispatch('home/getInfo') b、配合vuex的createNamespacedHelpers方法使用
import { createNamespacedHelpers } from 'vuex'
const { mapActions, mapState, mapMutations, mapGetters } = createNamespacedHelpers('home')
computed: {
...mapState({
initInfoState: state => state.initInfo
}),
...mapGetters([
'initInfo'
])
},
methods: {
...mapMutations([
'updateInitInfo'
]),
...mapActions([
'getInfo'
])
} c、使用原始的mapX方法
import { mapActions, mapState, mapMutations, mapGetters } from 'vuex'
computed: {
...mapState({
initInfoState: state => state.home.initInfo
}),
...mapGetters('home', [
'initInfo'
])
}
methods: {
...mapMutations('home', [
'updateInitInfo'
]),
...mapActions('home', [
'getInfo'
])
}

从vuex运行后的结构图可以看出,state的模块名成为其属性名,从而实现模块化;而getters、mutations、actions的模块名,则成为方法名的前缀,通过'/'分隔,从而实现模块化。从调用方法上可以看出,更容易看出两者的区别。如果你的代码是从非模块化,到模块化的改造,且都是使用的mapX方法进行方法管理,那么使用方案b的state方法,结合方案c的mapGetters、mapMutations、mapActions,将使得改造成本最小化。

tips:使用vuex的项目,建议使用mapX方法进行统一的管理,对vuex的调用较为直观,也便于将来的扩展和改造。

vuex数据管理-数据模块化的更多相关文章

  1. 为什么Vuex内数据改变了而组件没有进行更新?

    这两天在进行一个首页的制作,结果就碰到了标题上所述的问题了,用了一天的时间在网上查资料.终于找出了问题所在 Vuex的数据写在store里,在组件中需要用到this.$store.commit() 来 ...

  2. vue render函数使用jsx语法 可以使用v-model语法 vuex实现数据持久化

    render函数使用jsx语法: 安装插件  transform-vue-jsx 可以使用v-model语法安装插件 jsx-v-model .babelrc文件配置: vuex实现数据持久化 安装插 ...

  3. 简述vuex的数据传递流程

    简述vuex的数据传递流程 当组件进行数据修改的时候我们需要调用dispatch来触发actions里面的方法.actions里面的每个方法中都会有一个commit方法,当方法执行的时候会通过comm ...

  4. 解决vuex的数据刷新(F5)后会被初始化的问题

    介绍一个vuex的数据刷新(F5)后会被初始化的问题处理的插件:vuex-localstorage 实现的原理大概就是监听浏览器的刷新,关闭事件,把vuex的值存储到本地localstorage,刷新 ...

  5. 关于vuex的数据不直接给data而要通过computed

    # 为什么vuex的数据不直接给data而要通过computed计算 ## 疑惑 其实一直以来使用vue的状态管理vuex都有一个疑惑,文档中介绍,vue的状态数据`$store.state.xx`的 ...

  6. vuex数据管理-数据适配

    由于接口在上线前,不可避免的会出现变动,小则属性名变,大则结构变化.如果处理不当,结构变化时,视图的代码也需要做相应的更改,然后就是容错方法的变动,接着重新自测等,这样,变化成本随着结构的复杂度大大加 ...

  7. vue进阶:vuex(数据池)

    非父子组件传值 vuex 一.非父子组件传值 基于父子组件通信与传值实现非父子组件传值的示例关键代码: <template> <div> <!-- 学员展示 --> ...

  8. vuex存取数据展示在table里-----第一次实现

    之前也看了vuex的文档,对它的原理只是了解,看代码(仅自己复习.做笔记) 流程是在组件的created中提交dispatch,然后通过action调用一个封装好的axios然后再触发mutation ...

  9. vuex数据管理-数据共享

    应用场景 提供一个地址省市区地址联动操作的应用场景:在地址管理的地址修改.地址添加.选择送货区域等逻辑中,会用到该联动picker.在地址picker操作中,需要请求省份列表,下面以省份列表的操作为例 ...

随机推荐

  1. js-数组方法push

    <script type="text/javascript">        var arr=[1,2,3,4,5]        arr.push(6,7)      ...

  2. iOS处理视图上同时添加单击与双击手势的冲突问题

    _bgView.userInteractionEnabled = YES; //在cell上添加 bgView,给bgView添加两个手势检测方法 UITapGestureRecognizer *do ...

  3. how can I make the login form transparent?

    This is how you can make the Login Form transparent: 1. Add this css to Server Module-> Custom cs ...

  4. 在windows右键菜单中加入自己的程序 [转载]

    原文链接: http://blog.csdn.net/marklr/article/details/4006356  在windows右键菜单中加入自己的程序 标签: windowsattribute ...

  5. C#读取excel文件提示未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序

    错误描述: 在VS2010执行读取excel文件时,报错"未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序" 业务代码: //下 ...

  6. C#后台代码获取程序集资源文件

    资源会被打包在程序集内部. 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的应用程序目录是看不到这个文件的. 可以用相对于当前的XAML文件的相对Uri访问,<Imag ...

  7. boost bind及function的简单实现

    前面在做 http server 的时候,需要做一个回调的接口,要求能够绑定类的函数以及普通的函数到这个回调里,对于这种应用要求,选择 boost 的 bind 和 function 是最合适不过了, ...

  8. 如何查看 Ubuntu下已安装包版本号

    原文链接:https://www.cnblogs.com/the-tops/p/8350662.html 一个软件工具叫做apt-show-versions,通过apt-get安装: $sudo ap ...

  9. soap注入某sql2008服务器结合msf进行提权

    原文作者:陈小兵 在实际成功渗透过程中,漏洞的利用都是多个技术的融合,最新技术的实践,本次渗透利用sqlmap来确认注入点,通过sqlmap来获取webshell,结合msf来进行ms16-075的提 ...

  10. 大众点评Cat--架构分析

    转自:http://blog.csdn.net/szwandcj/article/details/51025669 Cat功能强大且多,光日志的报表和图表分析就有十几种,但文档却很少,寥寥无几找到一些 ...