React 不会在 setState 后重新渲染组件

React does not re-render component after setState

我有一个奇怪的问题。 state 已更新,但组件未重新渲染。当我按下按钮 Add Hi All 时,必须添加额外的 <p>Hi All</p>。但是我没有在屏幕上看到它们。

有趣的是,如果我将 new_row 更改为这样的 1 元素数组

var new_row = [<p key = {key_number + "d"}> Hi all!</p>];

然后将使用 parag_s.concat(new_row) 而不是 parag_s.push(new_row) 一切正常。 state.ps 数组的包含在两种变体中似乎完全相同但是当我使用时不知何故 parag_s.push(new_row) 重新渲染过程没有开始。
这就是为什么我觉得我做错了什么。你可以帮帮我吗?为什么以下代码不起作用?

import React from "react";
import ReactDOM from "react-dom";

class App extends React.Component {
    render() {
        return (
            <BlablablaComponent/>
        );
    }
}

class BlablablaComponent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            ps: [],
            keyNumber: 1
        }
        this.addRow = this.addRow.bind(this);
    }

    addRow() {
        var parag_s = this.state.ps;
        var key_number = this.state.keyNumber;
        key_number = key_number + 1;
        var new_row = <p key = {key_number + "d"}> Hi all!</p>;
        parag_s.push(new_row);
        var new_state = {ps: parag_s, keyNumber: key_number};
        this.setState(new_state);
   }

    render() {
        return (
            <div>
                {this.state.ps}
                <button type="button" onClick = {this.addRow} >Add Hi All</button> 
            </div>
        );
    }
}

ReactDOM.render(
    <App />,
    document.getElementById('root')
);

setState 对数组执行浅层比较,当您 push 进入数组时,实例不会改变,因此 React 看不到变化。当您使用 concat 时,将返回一个新的数组实例。

您可以使用展开运算符而不是 concat

 setState({
   key_number,
   parag_s: [...parag_s, new_row]
 })