在vue 和 vuex 的開發中,我們可能會遇到一些奇葩的問題,比如說下面的我在開發里遇到的一個奇葩問題。
vuex 的數據
/** * 獲取表格數據 VUEX */ import init from '../../api/init/init' const state = { tableData: { // 表格數據 content: [], // 表格數據 total: 0 // 總條數 } } const mutations = { getTableDataMutationsFn: function (data) { // 修改表格數據 state.tableData.content = data.content state.tableData.total = data.title } } const getters = { getTableDataGettersFn: state => { // 導出表格數據 return state.tableData } } const actions = { getTableData ({commit}, params) { // 獲取表格數據 init.getTableData(params, data => { commit('getTableDataMutationsFn', data) }) } } export default { state, getters, actions, mutations }
第一次初始化觸發actions的事件拿取數據的時候,數據經過 mutations 事件修改 state 的 tableData 里的 content 和 total 的數據時 會觸發 getter事件 將數據返回到頁面上,但是在頁面的頁數發生變化,重新觸發actions的獲取數據的事件觸發后,可以經過 mutations 的事件修改 state 的數據, 但是沒有觸發 getter 的數據變化, 而且也沒有觸發到頁面的變化。
剛開始的時候,我想的是是不是因為數據沒有改變,但是我又在數據修改后console。了一下數據,數據確實是修改了,我又在getter的事件里console。了一下,發現只有第一次初始化的時候,觸發了打印事件,在第二次頁面頁數發生改變觸發第二次actions的事件 ,修改了state的數據后沒有觸發getter 的事件。
剛開始我在網上看了很多關於 vuex的state變化了,但是頁面沒有觸發更新的文章,但是都沒有解決實質上的問題。后台我又自己慢慢琢磨,vuex是不能監聽到數組的長度變化的,所以我在想是不是因為這樣的原因。后來我就試了把代碼改成了
/** * 獲取表格數據 VUEX */ import init from '../../api/init/init' const state = { tableData: { // 表格數據 content: [], // 表格數據 total: 0 // 總條數 } } const mutations = { getTableDataMutationsFn: function (data) { // 修改表格數據 // 重置 數據 state.tableData.content = null state.tableData.total = null // 賦值 數據 state.tableData.content = data.content state.tableData.total = data.title } }
代碼改成這樣后,我們在數據修改前先把數據重置后,再進行修改,這個問題就得到了解決,但是也不知道這到底是為什么,這么奇葩的問題,就這樣解決了。(*^__^*)