官网 链接 学习可以在线编辑和视频结合的网址scrimba
index.js 写法一:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count0: 3 } }); import { mapState } from 'vuex'; new Vue({ el: '#app', store, data() { return { localCount: 4 } }, computed: mapState({ count: state => state.count, countAlias: 'count0', countPlusLocalState (state) { return state.count0 + this.localCount } }) }); <html> <head> <link rel="stylesheet" href="index.css"> </head> <body> <div id="app"> {{countPlusLocalState}} 111 {{countAlias}} </div> <script src="index.pack.js"></script> </body> </html>写法二:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 3 } }); import { mapState } from 'vuex'; new Vue({ el: '#app', store, data() { return { localCount: 4 } }, computed: mapState([ 'count' ]) });index.js
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { todos: [ { id: 1, text: '...', done: true }, { id: 2, text: '...', done: false }, { id: 3, text: '...', done: true }, { id: 4, text: '...', done: false }, { id: 5, text: '...', done: false }, { id: 6, text: '...', done: true }, ] }, getters: { doneTodos: state => { // return state.todos; return state.todos.filter(todo => todo.done); }, doneTodosCount: (state, getters) => { return getters.doneTodos.length } } }); new Vue({ el: '#app', store, data: { }, computed: { } }); console.log(store.getters.doneTodos) console.log("length:",store.getters.doneTodosCount)打印内容:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { todos: [ { id: 1, text: '...', done: true }, { id: 2, text: '...', done: false }, ] }, getters: { doneTodos: state => { return state.todos.filter(todo => todo.done==false); }, doneTodosCount: (state, getters) => { return getters.doneTodos.length }, getTodoById: (state) => (id) => { return state.todos.find(todo => todo.id === id) } } }); new Vue({ el: '#app', store, data: { }, computed: { } }); console.log(store.getters.doneTodos); console.log(store.getters.doneTodos.length); console.log(store.getters.getTodoById(1)) console.log(store.getters.getTodoById(48))
写法二:mapGetters
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { todos: [ { id: 1, text: '...', done: true }, { id: 2, text: '...', done: false }, ] }, getters: { doneTodos: state => { return state.todos.filter(todo => todo.done); }, doneTodosCount: (state, getters) => { return getters.doneTodos.length }, getTodoById: (state) => (id) => { return state.todos.find(todo => todo.id === id) } } }); import { mapGetters } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: mapGetters([ 'doneTodos', 'doneTodosCount', 'getTodoById' ]) }); console.log(store.getters.getTodoById(48)) <html> <head> <link rel="stylesheet" href="index.css"> </head> <body> <div id="app"> Completed Todos: {{ doneTodosCount }} <hr> doneTodos:{{doneTodos}} <hr> getTodoById:{{getTodoById(1)}} </div> <script src="index.pack.js"></script> </body> </html>commit写法一
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 2 }, mutations: { increment (state) { state.count++ }, incrementBy (state, n) { state.count += n } } }); import { mapState } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: mapState([ 'count' ]), }); store.commit('incrementBy', 8); console.log(store.state.count);commit写法二
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 2 }, mutations: { increment (state) { state.count++ }, incrementBy (state, payload) { state.count += payload.amount } } }); import { mapState } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: mapState([ 'count' ]), }); store.commit({ type: 'incrementBy', amount: 40 }) // store.commit('incrementBy', { amount: 29 }); console.log(store.state.count);methods方法中使用commit
写法一:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment1 (state) { state.count++ }, incrementBy (state, payload) { state.count += payload.amount } } }); import { mapState } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: mapState([ 'count' ]), methods: { increment () { this.$store.commit('increment1') } } }); <html> <head> <link rel="stylesheet" href="index.css"> </head> <body> <div id="app"> {{count}} <button @click='increment'>+</button> </div> <script src="index.pack.js"></script> </body> </html>写法二使用mapMutations
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ }, incrementBy (state, payload) { state.count += payload.amount } } }); import { mapState, mapMutations } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: mapState([ 'count' ]), methods: mapMutations([ 'increment', 'incrementBy' ]) }); <html> <head> <link rel="stylesheet" href="index.css"> </head> <body> <div id="app"> {{count}} <button @click='increment'>+</button> </div> <script src="index.pack.js"></script> </body> </html>第一种 不使用action,使用methods中commit调用store的mutation
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ }, decrement (state) { state.count-- } }, actions: { } }) import { mapState } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: mapState([ 'count' ]), methods: { increment () { this.$store.commit('increment'); }, decrement () { this.$store.commit('decrement'); }, } }); <html> <head> <link rel="stylesheet" href="index.css"> </head> <style> html, body { margin: 0; padding: 0; } #app { display: flex; flex-direction: row; align-content: center; justify-content: center; margin-top: 20% } #app > * { margin-left: 15px; } </style> <body> <div id="app"> {{count}} <button @click='increment'>+</button> <button @click='decrement'>-</button> </div> <script src="index.pack.js"></script> </body> </html>methods中this.$store.commit(‘increment’);<===>store中action中 context.commit(‘increment’) 使用action 达到以上效果 action 中使用mutation 可达到异步效果
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ }, decrement (state) { state.count-- } }, actions: { incrementAsync ({ commit }) { setTimeout(() => { commit('increment') }, 2000) } } }) import { mapState, mapMutations } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: mapState([ 'count' ]), methods: { increment () { this.$store.dispatch('incrementAsync'); }, decrement () { this.$store.commit('decrement'); }, } }); <html> <head> <link rel="stylesheet" href="index.css"> </head> <style> html, body { margin: 0; padding: 0; } #app { display: flex; flex-direction: row; align-content: center; justify-content: center; margin-top: 20% } #app > * { margin-left: 15px; } </style> <body> <div id="app"> {{count}} <button @click='increment'>+</button> <button @click='decrement'>-</button> </div> <script src="index.pack.js"></script> </body> </html>get
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ strict: true, state: { message: 'Hello Vuex', }, mutations: { updateMessage (state, message) { state.message = message } } }) import { mapState } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: { message () { return this.$store.state.message } }, methods: { updateMessage (e) { this.$store.commit('updateMessage', e.target.value) } } }) <html> <head> <link rel="stylesheet" href="index.css"> </head> <body> <div id="app"> {{message}}<br> <input :value='message' @input='updateMessage' /> </div> <script src="index.pack.js"></script> </body> </html>set
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ strict: true, state: { message: 'Hello Vuex', }, mutations: { updateMessage (state, message) { state.message = message } } }) import { mapState } from 'vuex'; new Vue({ el: '#app', store, data: { }, computed: { message: { get () { return this.$store.state.message }, set (value) { this.$store.commit('updateMessage', value) } } }, methods: { updateMessage (e) { this.$store.commit('updateMessage', e.target.value) } } }) <html> <head> <link rel="stylesheet" href="index.css"> </head> <body> <div id="app"> {{message}}<br> <input v-model='message' /> </div> <script src="index.pack.js"></script> </body> </html>