简体   繁体   English

我如何从 React-Redux 中的 reducer 中的状态更新对象数组中单个元素的名称字段?

[英]How can i update a name field from single element in array of object from a state in reducer in React-Redux?

Below are my initial state of reducers:以下是我的减速器的初始状态:

const InitialState = {
    data:[],
    SelectUser : null,
    name: "Not Yet Selected"
};

Below is my data[] state which is fetched from api:下面是我从 api 获取的数据 [] 状态:

[
 {
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
      "lat": "-37.3159",
      "lng": "81.1496"
    }
  },
  "phone": "1-770-736-8031 x56442",
  "website": "hildegard.org",
  "company": {
    "name": "Romaguera-Crona",
    "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
  }
 },
 {
  "id": 2,
  "name": "Ervin Howell",
  "username": "Antonette",
  "email": "Shanna@melissa.tv",
  "address": {
    "street": "Victor Plains",
    "suite": "Suite 879",
    "city": "Wisokyburgh",
    "zipcode": "90566-7771",
    "geo": {
      "lat": "-43.9509",
      "lng": "-34.4618"
    }
  },
  "phone": "010-692-6593 x09125",
  "website": "anastasia.net",
  "company": {
    "name": "Deckow-Crist",
    "catchPhrase": "Proactive didactic contingency",
    "bs": "synergize scalable supply-chains"
  }
 }
]

I want to change name from a object in state data[] to state name .我想将 name 从 state data[]中的对象更改为 state name Where id of object is same as that of id in object of SelecUser state.其中object的id与SelecUser状态object中的id相同。 SelectUser is also object whose contents are same as that of element in data[] . SelectUser也是一个对象,其内容与data[]中的元素相同。 All state are already set.所有状态都已设置。

Below are reducers created until now:以下是迄今为止创建的减速器:


const InitialState = {
    data:[],
    SelectUser : null,
    name: "Not Yet Selected"
};

export default (state=InitialState, action)=>{
    switch(action.type){
            case 'FETCH_USER':
                return {...state,data:action.payload};
            case 'USER_SELECTED':
                return {...state,SelectUser:action.payload};
            case 'USER_CHANGE':
                return {...state,name:action.payload};
            default:
                return state;
    }
};

All mentioned cases are previously executed.所有提到的案例都是以前执行过的。

I want to change name from a object in state data[] to state name in object with a same id which is already stored in SelectUser我想将名称从状态数据 [] 中的对象更改为具有相同 ID 的对象中的状态名称,该 ID 已存储在 SelectUser 中

I'm assuming that you want to change the name uppon an action which for simplicity I'm calling CHANGE_NAME .我假设您想根据某个action更改name ,为简单起见,我将其称为CHANGE_NAME

case 'CHANGE_NAME' return handleNameChange(state, action)

Now you just need to find in data the correspondent object, spread it's original content and override name现在你只需要在数据中找到对应的对象, spread它的原始内容并覆盖name

const handlerNameChange = (state, action) =>{
    const { name } = action

    return {
        ...state,
        data : state.data.map(item =>{
            if(item.id !== state.SelectUser.id) return item
            return {
                ...item,
                name
            }
        })
    }
}

Try this,试试这个,

export default (state=InitialState, action)=>{
    switch(action.type){
            case 'FETCH_USER':
                return {...state,data:action.payload};
            case 'USER_SELECTED':
                return {...state,SelectUser:action.payload};
            case 'USER_CHANGE':
                return {
                         ...state,
                         name: state.data.reduce((prev, item)=>{
                                  if(state.SelectUser && state.SelectUser.some(elt=>elt.id === item.id)){
                                      return item.name;
                                  }else{
                                      return prev;
                                  }
                         }, null);
                };
            default:
                return state;
    }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM