vuex-asr
Version:
* Version: 0.7.52 * License M.I.T. * [Online Documentation](https://vuex-asr.github.io/vuex-asr/) * author: Joris Wenting * email: vuex.asr@gmail.com * [linkedIn](https://www.linkedin.com/in/joriswenting/). * [contribute](https://vuex-asr.github.io/vuex-a
113 lines (79 loc) • 3.44 kB
Markdown
# namespacing
Since vuex-asr is intended to make building large scale applications more easy let's see what namespacing could bring to the table.
::: tip codesandbox
[namespacing example](https://codesandbox.io/s/manual-namespacing-q71oe)
:::
## namespace convention for all binders
The examples in this chapter illustrate how you could implement namespacing with `asr-bind-state`, but the convention is the same for all of the binders:
- asr-bind-state
- asr-bind-getters
- asr-bind-mutations
- asr-bind-actions
- asr-bind-config
## code organisation
There are as many reasons as much as there are ways to organise your code. A great help in organising code is by using namespaces to address the different aspects of your application.
## vuex namespacing
Since VUEX offers you an out-of-the box solution to organise your store, vuex-asr follows those conventions and enables you to namespace your store objects as well.
## example
Let's take a look at the [previous example](./aliasing.html) and extend our store with a User Module:
```js{4,6}
// src/vuex/modules/module-user.js
const ModuleUser = {
namespaced: true,
state: {
message: "I'm a message in the USER namespace"
},
};
export { ModuleUser };
```
As you can see nothing complicated going on here, we just have another variable `message`.
The property `namespaced` set to `true` tell's vuex to use namespacing for this module, if you omit `namespaced` the variables in this module would be available at rootlevel, and in our case create a naming conflict since we already have `message` defined in the root (store.js) file.
Now we import it into the root store:
```js{5,11}
// src/vuex/store.js
import Vue from "vue";
import Vuex from "vuex";
import { ModuleUser } from "./modules/module-user";
Vue.use(Vuex);
const Store = new Vuex.Store({
modules: {
User: ModuleUser,
},
state: {
message: "message in Root of VUEX",
anotherMessage: "also a message in Root of VUEX"
}
});
export { Store };
```
Notice the `modules` property added to the store. In here we've created the namespace `User` to which we assign the imported module.
## the App component
```vue{7,11}
// src/App.vue
<template>
<div id="app">
<example-message asr-bind-state="message"/>
<example-message asr-bind-state="anotherMessage AS message"/>
<example-message asr-bind-state="User/message"/>
<text-input asr-bind-state="message IS v-model"/>
<text-input asr-bind-state="anotherMessage AS message IS v-model"/>
<text-input asr-bind-state="User/message IS v-model"/>
</div>
</template>
...
```
Notice the pipe `/` character in the syntax: `USER/message` separating `USER` as namespace and `message` as the variable name.
## deeper namespaces
If we have a deeper namespace we extend the namespace with the `/` character:
For example binding a message from the USER/SETTINGS namespace:
```vue{5}
// src/App.vue
<template>
<div id="app">
<text-input asr-bind-state="User/Settings/message IS v-model"/>
</div>
</template>
...
```
## next steps
In the next chapter you learn how the `asr-pass` helper function comes in handy when building more complex components that have sub-components with store dependencies.