0

我有一个用于呈现新组件的按钮(实际上是图表,我已将示例简化为仅显示文本),它在第一次单击时向页面添加文本,但不会向页面添加任何新的文本对象进一步点击。

我已经测试了该函数是否在我多次按下它时实际上正在运行,方法是让它将元素添加到它所做的数组中,那么为什么它在多次单击时不向页面呈现新的文本对象?

我可能会遗漏一些基本的东西,如果有任何解释,我将不胜感激。

import React from 'react';
import './App.css';

class NewChart extends React.Component {
  render() {
    return (
      <div>Text</div>
    );
  }
}

class Button extends React.Component {
  render() {
    return (
      <button {...this.props}>
        Add chart
      </button>
    );
  }
}

class ChartApp extends React.Component {
  constructor() {
    super();
    this.state = {
        clicked: false
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({
        clicked: true
    });
  }

  render() {
    return (
      <div>
        <Button onClick={this.handleClick} />
        {this.state.clicked ? <NewChart />: null}
      </div>
    );
  }
};

export default React.createClass({
  render: function () {
    return (
      <div>
        <ChartApp>
        </ChartApp>
      </div>
    )
  }
});
4

2 回答 2

0

问题是您没有添加新项目,而只是根据checked. 诀窍是每次单击按钮时都有一个要渲染的元素数组并添加一个元素。

这里有一个工作示例:

import React from 'react';
import './App.css';

class NewChart extends React.Component {
  render() {
    return (
      <div key={this.props.key}>Text</div>
    );
  }
}

class Button extends React.Component {
  render() {
    return (
      <button {...this.props}>
        Add chart
          </button>
    );
  }
}

class ChartApp extends React.Component {
  constructor() {
    super();
    this.state = {
      elements: []
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    var newArray = this.state.elements.slice();
    newArray.push(<NewChart key={this.state.elements.length + 1}/>);
    this.setState({
      elements: newArray
    });
  }

  render() {
    return (
      <div>
        <Button onClick={this.handleClick} />
        {this.state.elements.map((elem) => {
          return elem;
        })}
      </div>
    );
  }
}

class App extends React.Component {
  render () {
    return (
      <div>
        <ChartApp />
      </div>
    )
  }
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
)
于 2017-03-20T19:37:10.487 回答
0

您目前正在使用将单个标志设置为 true 的按钮,然后在该标志为 true 时渲染组件。如果你想渲染多个组件,你需要你的状态的某个方面与你想要渲染的组件数量相关,然后基于它进行渲染。例如,正如您提到的,如果您使用数组或计数器变量,那么您可以使用其中一个.map甚至是 for 循环来呈现多个组件。现在你只要求 React 有条件地渲染一个 NewChart 组件。

于 2017-03-20T19:13:04.517 回答