better vuex store

This commit is contained in:
Brendan 2016-12-25 21:16:30 +01:00
parent 1fc685a880
commit d7c5babf1f
8 changed files with 94 additions and 18 deletions

View File

@ -1,8 +1,11 @@
<template> <template>
<div> <div>
<p> <p>
<button @click="increment">{{ counter }}</button><br> <button @click="increment">{{ counter }}</button>
<br>
<nuxt-link to="/about">About</nuxt-link> <nuxt-link to="/about">About</nuxt-link>
<br>
<nuxt-link to="/todos">Todos</nuxt-link>
</p> </p>
</div> </div>
</template> </template>

View File

@ -0,0 +1,41 @@
<template>
<div>
<h2>Todos</h2>
<input placeholder="What needs to be done?" @keyup.enter="addTodo">
<ul>
<li v-for="todo in todos">
<input type="checkbox" :checked="todo.done" @change="toggle({ todo })">
<label v-text="todo.text" @dblclick="editing = true"></label>
</li>
</ul>
<nuxt-link to="/">Home</nuxt-link>
</div>
</template>
<script>
import { mapMutations } from 'vuex'
export default {
computed: {
todos () { return this.$store.state.todos.list }
},
methods: {
addTodo (e) {
var text = e.target.value
if (text.trim()) {
this.$store.commit('todos/add', { text })
}
e.target.value = ''
},
...mapMutations({
toggle: 'todos/toggle'
})
}
}
</script>
<style>
li {
list-style: none;
}
</style>

View File

@ -1,17 +1,7 @@
import Vue from 'vue' export const state = { counter: 0 }
import Vuex from 'vuex'
Vue.use(Vuex) export const mutations = {
const store = new Vuex.Store({
state: {
counter: 0
},
mutations: {
increment (state) { increment (state) {
state.counter++ state.counter++
} }
} }
})
export default store

View File

@ -0,0 +1,20 @@
export const state = {
list: []
}
export const mutations = {
add (state, { text }) {
state.list.push({
text,
done: false
})
},
delete (state, { todo }) {
state.list.splice(state.list.indexOf(todo), 1)
},
toggle (state, { todo }) {
todo.done = !todo.done
}
}

View File

@ -3,7 +3,7 @@
import Vue from 'vue' import Vue from 'vue'
import Meta from 'vue-meta' import Meta from 'vue-meta'
import router from './router.js' import router from './router.js'
<% if (store) { %>import store from '~store/index.js'<% } %> <% if (store) { %>import store from './store.js'<% } %>
import NuxtChild from './components/nuxt-child.js' import NuxtChild from './components/nuxt-child.js'
import NuxtLink from './components/nuxt-link.js' import NuxtLink from './components/nuxt-link.js'
import Nuxt from './components/nuxt.vue' import Nuxt from './components/nuxt.vue'

18
lib/app/store.js Normal file
View File

@ -0,0 +1,18 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const files = require.context('~store', false, /^\.\/.*\.js$/)
const storeData = { modules: {} }
for (let filename of files.keys()) {
let name = filename.replace(/^\.\//, '').replace(/\.js$/, '')
if (name === 'index') {
Object.assign(storeData, files(filename))
} else {
storeData.modules[name] = files(filename)
storeData.modules[name].namespaced = true
}
}
export default new Vuex.Store(storeData)

View File

@ -191,6 +191,10 @@ function * generateRoutesAndFiles () {
templatesFiles.push('layouts/default.vue') templatesFiles.push('layouts/default.vue')
layouts.default = r(__dirname, 'app', 'layouts', 'default.vue') layouts.default = r(__dirname, 'app', 'layouts', 'default.vue')
} }
// Add store if needed
if (this.options.store) {
templatesFiles.push('store.js')
}
let moveTemplates = templatesFiles.map((file) => { let moveTemplates = templatesFiles.map((file) => {
return readFile(r(__dirname, 'app', file), 'utf8') return readFile(r(__dirname, 'app', file), 'utf8')
.then((fileContent) => { .then((fileContent) => {

View File

@ -51,7 +51,7 @@ class Nuxt {
this.dir = (typeof options.rootDir === 'string' && options.rootDir ? options.rootDir : process.cwd()) this.dir = (typeof options.rootDir === 'string' && options.rootDir ? options.rootDir : process.cwd())
this.srcDir = (typeof options.srcDir === 'string' && options.srcDir ? resolve(this.dir, options.srcDir) : this.dir) this.srcDir = (typeof options.srcDir === 'string' && options.srcDir ? resolve(this.dir, options.srcDir) : this.dir)
// If store defined, update store options to true // If store defined, update store options to true
if (fs.existsSync(join(this.srcDir, 'store', 'index.js'))) { if (fs.existsSync(join(this.srcDir, 'store'))) {
this.options.store = true this.options.store = true
} }
// Template // Template