React按钮不会渲染多次

时间:2017-03-20 19:09:58

标签: javascript reactjs react-chartjs

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

我已经测试过,当我通过多次按下它来向元素添加元素时多次按下它来查看该函数是否正在运行,那么为什么不向页面渲染新的文本对象呢?多次点击?

我可能会遗漏一些基本的东西,并会感激任何解释。

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>
    )
  }
});

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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')
)