【问题标题】:Pushing an element into an object将元素推入对象
【发布时间】:2017-09-17 09:51:28
【问题描述】:

我是 React 的新手,但我很确定这个问题与 Javascript 的关系比 React 更重要。我想将自定义元素推送到已经在 React 中创建的对象中,而不触发 forceUpdate()

我想将fullName 推送到person 对象。所以我可以像这样在 React 中访问它,this.state.person.fullName 而不是 this.state.fullName

现在我知道我可以做到:this.state.person.fullName = this.formatName(person.name)

但这需要forceUpdate() 触发重新渲染。我认为这不是推荐的方式。

class Person extends React.Component {
    constructor(props) {
        super(props);
        this.url = "https://randomuser.me/api";
        this.state = {
            person: {
                fullName: '',
            },

        };

        this.generate = this.generate.bind(this);
    }

    formatName(name) {
        // Mr.Jon Snow
        return `${name.title}.${name.first} ${name.last}`;
    }
    generate() {
        axios.get(this.url).then(response => {
            var person = response.data.results[0];
            this.setState({
                person: person,
                fullName: this.formatName(person.name)
            });
        });
    }
    render() {
        return (
            <div>
                <button onClick={this.generate}>Generate</button>
                <div className="card">
                    <h3>The person's information</h3>
                    <div className="person-name">Name: {this.state.fullName}</div>
                    <div className="person-dob">Date of Birth: {this.state.person.dob}</div>
                    <div className="person-email">Email: {this.state.person.email}</div>
                    <div className="person-phone">Phone Number: {this.state.person.phone}</div>
                </div>
            </div>
        )
    }
}

ReactDOM.render(<Person />, document.getElementById('app'));

【问题讨论】:

    标签: javascript reactjs object object-literal


    【解决方案1】:
    var person = response.data.results[0];
    person.fullName = this.formatName(person.name);
    this.setState({
        person: person,
    });
    

    【讨论】:

      【解决方案2】:

      您可以使用ES6 Spread Syntax 根据您的要求进行更改。

      示例

      this.setState((prevState) => ({
        person: {
          ...prevState.person,
          fullName: this.formatName(person.name)
        }
      }))
      

      更新 (我误解了问题。这与问题更相关)

      let person = response.data.results[0];
      person["fullName"] = this.formatName(person.name);
      this.setState({
        person: person
      });
      

      【讨论】:

      • 现在person对象的属性是空的,但是显示的是fullName...会不会是因为我没有使用编译器?
      • @Akar 我更新了答案。我想我一开始就听错了你问的问题。请尝试看看第二个示例是否有帮助。
      • 你和 Pratheep 都解决了这个问题,但我更喜欢他的解决方案,不过我仍然赞成这两个答案,感谢您抽出宝贵时间。
      • @akar,如果您使用ES6,您可以使用Object.assign 方法(如我的回答)。为了写一个清晰的解决方案。
      【解决方案3】:

      您可以使用Object.assign() 方法来实现您的要求。

      var person = response.data.results[0];
      Object.assign(person,{"fullName": this.formatName(person.name)};
      this.state = {
           person: person
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-17
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 2021-02-14
        • 2017-12-05
        相关资源
        最近更新 更多