代码之家  ›  专栏  ›  技术社区  ›  Sam

是否可以设置状态以将新条目添加到带编号键的对象开头?

  •  2
  • Sam  · 技术社区  · 8 年前

    我有一个对象包含 number , text 以及当时 created . 当函数被触发时,我想 setState 要将新的键值项添加到此对象的开头,请执行以下操作:

    this.state.object = {
       '0': {
           'number': '6041234567',
           'text': 'hello world',
           'created': 1531748662    
       },
       '1': {
           'number': '4384321234',
           'text': 'second message',
           'created': 15317489823  
       }
    }
    

    新条目将如下所示:

    '0': {
        'number': 1234567,
        'text': "this is a new text",
        'created': 1531748892    
    }
    

    我想把它添加到对象的开头。

    这是我有的,但它正在创建全新的条目,最重要的问题是 它覆盖了第一个条目 .

    this.setState({
        ...this.state.recentMessages, this.state.recentMessages: 0 {
           'number': 1234567,
           'text': "this is a new text",
           'created': 1531748892  
        },
    });
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   dance2die    8 年前


    https://codesandbox.io/s/olqmo1z6yq

    render()

    import React from "react";
    import ReactDOM from "react-dom";
    
    class App extends React.Component {
      state = { data: [] };
      static number = 1;
    
      addData = e => {
        const newItem = {
          number: App.number,
          text: `text ${App.number}`,
          created: 15317489825
        };
        App.number++;
    
        this.setState(prevState => {
          const data = [...prevState.data, newItem];
          return { data };
        });
      };
    
      render() {
        const { data } = this.state;
        const sortedData = Object.entries(data)
          // sort in descneding order, showing the Latest message first.
          .sort((a, b) => b - a)
          .map(entry => {
            const [key, item] = entry;
            const { text, number, created } = item;
    
            return (
              <div key={key}>
                <span>{text}</span>
                <div>Number: {number}</div>
                <div>Created: {created}</div>
                <hr />
              </div>
            );
          });
    
        return (
          <div>
            <button onClick={this.addData}>Add New Data</button>
            {sortedData}
          </div>
        );
      }
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App />, rootElement);