如何在 Vuex 插件中观察变化
How To Watch Mutation In Vuex Plugin
我尝试使用的插件有问题。请注意,代码在刷新页面后工作正常,但在初始登录时设置为监视的突变 (createSession
) 没有正确响应。我不确定是否有人熟悉 CASL 包,但我认为问题不存在,但也许我需要做一些事情才能使插件正常工作。
这是插件ability.js
import { Ability } from '@casl/ability'
export const ability = new Ability()
export const abilityPlugin = (store) => {
ability.update(store.state.rules)
const rules = store.subscribe((mutation) => {
switch (mutation.type) {
case 'createSession':
ability.update(mutation.payload.rules)
break
case 'destroySession':
ability.update([{ actions: '', subject: '' }])
break
}
console.log(ability.rules)
})
return rules
}
这是我要进口的商店
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
import { abilityPlugin, ability as appAbility } from './utils/ability'
import storage from './utils/storage'
export const ability = appAbility
Vue.use(Vuex)
axios.defaults.baseURL = 'http://traxit.test/api'
export default new Vuex.Store({
plugins: [
storage({
storedKeys: ['rules', 'token'],
destroyOn: ['destroySession']
}),
abilityPlugin
],
state: {
rules: '',
token: localStorage.getItem('access_token') || null,
sidebarOpen: true,
loading: false,
},
mutations: {
createSession(state, session) {
state.rules = session[0]
state.token = session.access_token
},
}
我正在使用初始登录操作的响应数据对 createSession
进行突变,该操作是在此处检索令牌和规则
retrieveToken({ commit }, credentials) {
return new Promise((resolve, reject) => {
axios.post('/login', {
username: credentials.username,
password: credentials.password,
})
.then(response => {
const token = response.data.access_token
localStorage.setItem('access_token', token)
commit('createSession', response.data)
resolve(response)
})
.catch(error => {
console.log(error)
reject(error)
})
})
},
任何帮助将不胜感激!!我在这个问题上纠结了一段时间..
再次回答我自己的问题。哈哈
所以在控制台登录我的 mutation.payload
之后,我意识到我正在尝试错误地访问数据。
我转了
case 'createSession':
ability.update(mutation.payload.rules)
break
至此
case 'createSession':
ability.update(mutation.payload[0])
break
我尝试使用的插件有问题。请注意,代码在刷新页面后工作正常,但在初始登录时设置为监视的突变 (createSession
) 没有正确响应。我不确定是否有人熟悉 CASL 包,但我认为问题不存在,但也许我需要做一些事情才能使插件正常工作。
这是插件ability.js
import { Ability } from '@casl/ability'
export const ability = new Ability()
export const abilityPlugin = (store) => {
ability.update(store.state.rules)
const rules = store.subscribe((mutation) => {
switch (mutation.type) {
case 'createSession':
ability.update(mutation.payload.rules)
break
case 'destroySession':
ability.update([{ actions: '', subject: '' }])
break
}
console.log(ability.rules)
})
return rules
}
这是我要进口的商店
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
import { abilityPlugin, ability as appAbility } from './utils/ability'
import storage from './utils/storage'
export const ability = appAbility
Vue.use(Vuex)
axios.defaults.baseURL = 'http://traxit.test/api'
export default new Vuex.Store({
plugins: [
storage({
storedKeys: ['rules', 'token'],
destroyOn: ['destroySession']
}),
abilityPlugin
],
state: {
rules: '',
token: localStorage.getItem('access_token') || null,
sidebarOpen: true,
loading: false,
},
mutations: {
createSession(state, session) {
state.rules = session[0]
state.token = session.access_token
},
}
我正在使用初始登录操作的响应数据对 createSession
进行突变,该操作是在此处检索令牌和规则
retrieveToken({ commit }, credentials) {
return new Promise((resolve, reject) => {
axios.post('/login', {
username: credentials.username,
password: credentials.password,
})
.then(response => {
const token = response.data.access_token
localStorage.setItem('access_token', token)
commit('createSession', response.data)
resolve(response)
})
.catch(error => {
console.log(error)
reject(error)
})
})
},
任何帮助将不胜感激!!我在这个问题上纠结了一段时间..
再次回答我自己的问题。哈哈
所以在控制台登录我的 mutation.payload
之后,我意识到我正在尝试错误地访问数据。
我转了
case 'createSession':
ability.update(mutation.payload.rules)
break
至此
case 'createSession':
ability.update(mutation.payload[0])
break