将元素推入对象

时间:2017-09-17 09:51:28

标签: javascript reactjs object object-literal

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

我想将fullName推送到person对象。所以我可以像这样使用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'));

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以使用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
});

答案 2 :(得分:1)

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

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