mirror of
https://github.com/nuxt/nuxt.git
synced 2025-02-06 21:10:38 +00:00
Merge pull request #447 from rhwilrForks/master
Allow nested vuex modules
This commit is contained in:
commit
494364604d
@ -1,11 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
|
<h3>Index Module</h3>
|
||||||
<button @click="increment">{{ counter }}</button>
|
<button @click="increment">{{ counter }}</button>
|
||||||
<br>
|
<br>
|
||||||
<nuxt-link to="/about">About</nuxt-link>
|
<nuxt-link to="/about">About</nuxt-link>
|
||||||
<br>
|
<br>
|
||||||
|
<br>
|
||||||
|
<h3>Todo Module</h3>
|
||||||
<nuxt-link to="/todos">Todos</nuxt-link>
|
<nuxt-link to="/todos">Todos</nuxt-link>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<h3>Nested Modules</h3>
|
||||||
|
<nuxt-link to="/website">Website</nuxt-link>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
33
examples/vuex-store-modules/pages/website.vue
Normal file
33
examples/vuex-store-modules/pages/website.vue
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h2>Articles</h2>
|
||||||
|
<ul>
|
||||||
|
<li v-for="article in articles">
|
||||||
|
<span>{{article}}</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h2>Comments <small>(nested under articles)</small></h2>
|
||||||
|
<ul>
|
||||||
|
<li v-for="comment in comments">
|
||||||
|
<span>{{comment}}</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<nuxt-link to="/">Home</nuxt-link>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapGetters } from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
computed: mapGetters({
|
||||||
|
articles: 'articles/get',
|
||||||
|
comments: 'articles/comments/get'
|
||||||
|
}),
|
||||||
|
methods: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
</style>
|
19
examples/vuex-store-modules/store/articles.js
Normal file
19
examples/vuex-store-modules/store/articles.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
export const state = {
|
||||||
|
list: [
|
||||||
|
'Lorem ipsum',
|
||||||
|
'dolor sit amet',
|
||||||
|
'consetetur sadipscing elitr'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const mutations = {
|
||||||
|
add (state, title) {
|
||||||
|
state.list.push(title)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getters = {
|
||||||
|
get (state) {
|
||||||
|
return state.list
|
||||||
|
}
|
||||||
|
}
|
19
examples/vuex-store-modules/store/articles/comments.js
Normal file
19
examples/vuex-store-modules/store/articles/comments.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
export const state = {
|
||||||
|
list: [
|
||||||
|
'Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
|
||||||
|
'Lorem ipsum dolor sit amet, consetetur sadipscing elit.',
|
||||||
|
'Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const mutations = {
|
||||||
|
add (state, title) {
|
||||||
|
state.list.push(title)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getters = {
|
||||||
|
get (state) {
|
||||||
|
return state.list
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,7 @@ import Vue from 'vue'
|
|||||||
import Vuex from 'vuex'
|
import Vuex from 'vuex'
|
||||||
Vue.use(Vuex)
|
Vue.use(Vuex)
|
||||||
|
|
||||||
let files = require.context('~/store', false, /^\.\/.*\.js$/)
|
let files = require.context('~/store', true, /^\.\/.*\.js$/)
|
||||||
let filenames = files.keys()
|
let filenames = files.keys()
|
||||||
|
|
||||||
function getModule (filename) {
|
function getModule (filename) {
|
||||||
@ -12,6 +12,18 @@ function getModule (filename) {
|
|||||||
: file
|
: file
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getModuleNamespace (storeData, namePath) {
|
||||||
|
if (namePath.length == 1) return storeData.modules
|
||||||
|
|
||||||
|
let namespace = namePath.shift()
|
||||||
|
|
||||||
|
storeData.modules[namespace] = storeData.modules[namespace] || {}
|
||||||
|
storeData.modules[namespace].namespaced = true
|
||||||
|
storeData.modules[namespace].modules = storeData.modules[namespace].modules || {}
|
||||||
|
|
||||||
|
return getModuleNamespace(storeData.modules[namespace], namePath)
|
||||||
|
}
|
||||||
|
|
||||||
let store
|
let store
|
||||||
let storeData = {}
|
let storeData = {}
|
||||||
|
|
||||||
@ -31,8 +43,13 @@ if (store == null) {
|
|||||||
for (let filename of filenames) {
|
for (let filename of filenames) {
|
||||||
let name = filename.replace(/^\.\//, '').replace(/\.js$/, '')
|
let name = filename.replace(/^\.\//, '').replace(/\.js$/, '')
|
||||||
if (name === 'index') continue
|
if (name === 'index') continue
|
||||||
storeData.modules[name] = getModule(filename)
|
|
||||||
storeData.modules[name].namespaced = true
|
let namePath = name.split(/\//)
|
||||||
|
let module = getModuleNamespace(storeData, namePath)
|
||||||
|
|
||||||
|
name = namePath.pop()
|
||||||
|
module[name] = getModule(filename)
|
||||||
|
module[name].namespaced = true
|
||||||
}
|
}
|
||||||
store = new Vuex.Store(storeData)
|
store = new Vuex.Store(storeData)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user