How to update object in React state

后端 未结 5 1367
野的像风
野的像风 2021-02-18 22:30

I have an indexed list of users in the JS object (not array). It\'s part of the React state.

{
    1: { id: 1, name: \"John\" }
    2: { id: 2, name         


        
相关标签:
5条回答
  • 2021-02-18 23:09

    Using spreads:

    Adding

    this.setState({
      ...this.state,
      4: { id: 4, name: "Jane" },
    }
    

    Removing id 2

    let prevState = this.state;
    let {"2": id, ...nextState} = prevState;
    this.setState({
      ...nextState,
    }
    

    Changing id 2

    this.setState({
      ...this.state,
      2: {
        ...this.state["2"],
        name: "Peter",
      }
    }
    
    0 讨论(0)
  • 2021-02-18 23:18

    setState also accepts a function, which you might find more intuitive

    function add( user ) {
      this.setState( users => {
        users[ user.id ] = user
        return users
      }
    }
    
    function remove( id ) {
      this.setState( users => {
        delete users[ id ]
        return users
    }
    

    These functions assume that your state object is your users object, if it is actually state.users then you'd have to pick users out, passing a function to setState will always be called passing the actual state object.

    In this example add can also be used to amend, depending on your actual use-case you may want to create separate helpers.

    0 讨论(0)
  • 2021-02-18 23:21

    This is what i would do

    • add: var newUsers = _.extend({}, users, { 4: { id: 4, ... } })
    • remove: var newUsers = _.extend({}, users) then delete newUsers['2']
    • change: var newUsers = _.extend({}, users) then newUsers['2'].name = 'Peter'
    0 讨论(0)
  • 2021-02-18 23:21

    Apart from _.extend you can use Map for storing user

    let user = new Map();
    user.set(4, { id: 4, name: "Jane" }); //adds with id (4) as key
    user.myMap.set(2, { id: 2, name: "Peter" }); // set user #2 to "Peter"
    user.delete(3); //deletes user with id 3
    
    0 讨论(0)
  • 2021-02-18 23:23

    If you're not using Flux, you use this.setState() to update the state object.

    delUser(id) {
        const users = this.state.users;
        delete users[id];
        this.setState(users);
    }
    
    addChangeUser(id, name) {
        const users = this.state.users;
        users[id] = {id: id, name: name};
        this.setState(users);
    }
    

    Then you can execute your test cases with this:

    addChangeUser(4, 'Jane);
    addChangeUser(2, 'Peter');
    delUser(2);
    
    0 讨论(0)
提交回复
热议问题