Javascript 更新状态,其中Redux/React中的值=x
我的商店中有一组用户,设置如下:Javascript 更新状态,其中Redux/React中的值=x,javascript,reactjs,redux,lodash,normalizr,Javascript,Reactjs,Redux,Lodash,Normalizr,我的商店中有一组用户,设置如下: {users: {user_id: 1, user_name: Adam, user_score: 100}, {user_id: 2, user_name: Bob, user_score: 200}, {user_id: 3, user_name: Charlie, user_score: 300}} {user_id: 1, score: 10} 我的项目正在从如下设置的服务器接收JSON数据: {users: {user_id: 1, user_
{users: {user_id: 1, user_name: Adam, user_score: 100},
{user_id: 2, user_name: Bob, user_score: 200},
{user_id: 3, user_name: Charlie, user_score: 300}}
{user_id: 1, score: 10}
我的项目正在从如下设置的服务器接收JSON数据:
{users: {user_id: 1, user_name: Adam, user_score: 100},
{user_id: 2, user_name: Bob, user_score: 200},
{user_id: 3, user_name: Charlie, user_score: 300}}
{user_id: 1, score: 10}
我想找到传递数据的user\u id
与现有用户集的user\u id
匹配的位置,并将分数更新为传入的score
例如,如果减速机接收到{user_id:2,score:10}
如何将分数更改为10
,其中原始状态下的用户id等于2
。当然,在避免变异的同时
用什么方法做这件事最好?正常化者?洛达斯?更新()?
看起来很简单,我肯定错过了一些明显的东西。
谢谢。我建议为此使用immutable.js
将要更新的用户的id
传递到操作
,然后将其传递到减速机
,并使用不可变
更新用户数据
所以您在immutable中编写的代码类似于
const data = Immutable.fromJS(state)
const newState = data.setIn(['users', user_id, 'score'], 10);
return newState.toJS()
附言:我还没有测试过上面的内容,但它应该可以工作(如果没有修改的话)
您可以阅读有关不可变的内容
此外,我还建议您阅读一个类似的答案为此,我建议使用immutable.js
将要更新的用户的id
传递到操作
,然后将其传递到减速机
,并使用不可变
更新用户数据
所以您在immutable中编写的代码类似于
const data = Immutable.fromJS(state)
const newState = data.setIn(['users', user_id, 'score'], 10);
return newState.toJS()
附言:我还没有测试过上面的内容,但它应该可以工作(如果没有修改的话)
您可以阅读有关不可变的内容
另外,我建议您在reducer中使用类似的答案,您可以遍历现有用户数组,并为与用户id
匹配的数组设置一个新值
function usersReducer(state = [], action) {
switch (action.type) {
case 'UPDATE_SCORE':
var { user_id, score } = action
return state.map(u => {
if (u.user_id === user_id) {
// for the matching user, return an
// object with the updated score
return Object.assign({}, u, { score })
} else {
// for all other users, return the
// existing object
return u
}
})
default:
return state
}
}
在reducer中,您可以遍历现有用户数组,并为与用户id
匹配的数组设置一个新值
function usersReducer(state = [], action) {
switch (action.type) {
case 'UPDATE_SCORE':
var { user_id, score } = action
return state.map(u => {
if (u.user_id === user_id) {
// for the matching user, return an
// object with the updated score
return Object.assign({}, u, { score })
} else {
// for all other users, return the
// existing object
return u
}
})
default:
return state
}
}