插件(Plugin)
Vuex 的 store 接受 plugins
選項,這個選項露出每個 mutation 的鉤子 (hook), Vuex 插件就是一個函數,他接收 store 作為唯一參數,我們用以下範例來解釋。
使用插件的方式:
1 2 3 4
| const store = new Vuex.Store({ plugins: [myPlugin], });
|
插件的內容:
1 2 3 4 5 6 7
| const myPlugin = store => { store.subscribe((mutation, state) => { }); };
|
在插件內提交 mutation
Plugin 與 Component 一樣不允許直接修改狀態,我們只能通過提交 mutation 來觸發 store 的變化。
範例
我們以 socket 的方式來模擬一個聊天室
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| export default function createWebSocketPlugin(socket) { return store => { socket.on('data', data => { store.commit('receiveData', data); });
store.subscribe(mutation => { if (mutation.type === 'deleteMessage') { socket.emit('update', mutation.payload); } }); }; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| const plugin = createWebSocketPlugin(socket);
const store = new Vuex.Store({ state: { data: {}, }, mutations: { updateData(data) { state.data = data; }, }, plugins: [plugin], });
|