无法修改对象数组指定元素?Framework7-Vue状态更新问题求助
问题描述
我编写了一个函数,意图通过匹配ID修改对象数组中用户的邮箱,代码如下:
for (var i = 0; i < state.users.length; i++){ if (state.users[i].id == id) { state.users[i].email = change; console.log(state.users[i].email) } }
但使用赋值操作后,state.users[i]的值并未发生改变。请问该如何实现修改?
状态定义代码:
state: { users: [ {id: 1, name : "test", password : "test" , email : 'test@test.com', admin : false}, {id: 2, name : "Pol", password: "PolProva", email : 'Pol@test.com', admin : true}, {id: 3, name : "Marta", password : "MartaProva", email : 'Marta@test.com', admin : true} ], userLogged : false },
组件调用代码:
import {f7, useStore } from 'framework7-vue'; import localforage from 'localforage'; export default { setup(){ const users = useStore('getUsers'); /*const editGeneral = (id, change, toChange) => f7.store.dispatch('editName', {id : id, change : change, toChange : toChange}); */ const testChange = (id, change) => f7.store.dispatch('testChange', {id : id, change : change}) return{ users, /*editGeneral,*/ testChange }; }, }
解决方案
Framework7的Store遵循与Vuex一致的响应式规则:不能直接修改原state中的对象或数组引用,直接修改数组元素的属性无法被响应式系统监测到,所以state和页面都不会更新。
你需要通过生成新的对象和数组来触发更新,具体修改方式如下:
方法一:使用findIndex和数组切片创建新数组
在Store的mutations中实现:
mutations: { testChange(state, { id, change }) { const targetIndex = state.users.findIndex(user => user.id === id); if (targetIndex !== -1) { // 复制原用户对象并修改email,避免直接修改原对象 const updatedUser = { ...state.users[targetIndex], email: change }; // 创建新数组替换原数组 state.users = [ ...state.users.slice(0, targetIndex), updatedUser, ...state.users.slice(targetIndex + 1) ]; } } }
方法二:使用map生成新数组(更简洁)
mutations: { testChange(state, { id, change }) { state.users = state.users.map(user => { // 匹配到目标用户时返回新对象,否则返回原对象 return user.id === id ? { ...user, email: change } : user; }); } }
两种方法都通过创建新的用户对象和数组,让响应式系统监测到引用变化,从而同步更新state和页面显示的邮箱值。
内容的提问来源于stack exchange,提问作者Pchaozz
相关产品推荐
相关产品推荐

