Остановить автоматический рендеринг на экране в React

У меня есть два класса, и от одного я передаю значения другому, у меня есть кнопка в родительском классе, которая должна вызвать функцию, после которой должен отображаться контент

Родительский класс такой

импорт React из 'реакции';

import ReactDOM from 'react-dom';
//import DonutChart from 'react-donut-chart';
import propTypes from 'prop-types';
import {Display} from './Display.js';
import {DonutChart} from './DonutChart.js'

class App extends React.Component{
  constructor(props){
    super(props);
    this.state={
     text:0,
     label:'',
     value:'',
     isClicked:false,
     num:0,
     isChecked:true,
     list:[]
    }
    this.changeText=this.changeText.bind(this);
    ///this.display=this.display.bind(this);
    this.check=this.check.bind(this);
  }

  changeText(e){
    this.setState({
      label:e.target.value,   
    })     
  }
  display(){
    var num=document.getElementById('number').value; 
    var text=parseInt(num);
    var label=document.getElementById('label').value;
    this.setState({
      isClicked:true,
      text:text,
      label:''
    })


  }
  check(){
    var start_date=document.getElementById("start_date").value;
    var end_date=document.getElementById("end_date").value;

    console.log(typeof(start_date));
    if(new Date(start_date)>new Date(end_date)){
      alert("Please enter valid dates");
          this.setState({
            isChecked:false
      })
    }else{
      this.setState({
        isChecked:true
      })
      this.display();
    }

  }
  render(){
    var listElements=[];
    listElements.push(<DonutChart data={this.state.text} label={this.state.label}/>);
    return(
      <div className="row">
        <div className="col-md-6">
          <input type="text" placeholder="Enter name" id='label' onChange={this.changeText} value={this.state.label}/> 
          <input type='number' id='number'/>
          <label>Start Date:<input type="date" id="start_date"/></label>
          <label>End Date:<input type="date" id="end_date"/></label>
          <button onClick={this.check}>Click here</button>
        </div>
        <div className="col-md-6">
          {listElements}   
        </div>
      </div>
      )

  }
}

App.propTypes={
  text:propTypes.number,
  num:propTypes.number
}



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

И в моем классе DonutChart у меня есть

import React from 'react';
import ReactDOM from 'react-dom';
//import DonutChart from 'react-donut-chart';
import propTypes from 'prop-types';

class DonutChart extends React.Component{
  render(){ 
    return(
      <div>
        <span>{this.props.label}</span>
      </div>
    )
  }
}


module.exports={
    DonutChart:DonutChart
}

Теперь, когда я печатаю в поле ввода, оно автоматически отображается на экране. И я хочу, чтобы он отображался по нажатию кнопки. Я не совсем понимаю концепцию связывания в реакции. Пожалуйста помоги.

1 ответ

У меня та же проблема.. я использовал componentShouldUpdate

ваш родительский класс:

import ReactDOM from 'react-dom';
//import DonutChart from 'react-donut-chart';
import propTypes from 'prop-types';
import {Display} from './Display.js';
import {DonutChart} from './DonutChart.js'

class App extends React.Component{
  constructor(props){
    super(props);
    this.state={
     text:0,
     label:'',
     value:'',
     isClicked:false,
     num:0,
     isChecked:true,
     list:[],
     updateComponent: true //new field
    }
    this.changeText=this.changeText.bind(this);
    ///this.display=this.display.bind(this);
    this.check=this.check.bind(this);
  }

  componentDidMount(){ //added
      this.setState({updateComponent:false})
  }
  changeText(e){
    this.setState({
      label:e.target.value,   
    })     
  }
  display(){
    var num=document.getElementById('number').value; 
    var text=parseInt(num);
    var label=document.getElementById('label').value;
    this.setState({
      isClicked:true,
      text:text,
      label:''
    })


  }
  check(){
    var start_date=document.getElementById("start_date").value;
    var end_date=document.getElementById("end_date").value;

    console.log(typeof(start_date));
    if(new Date(start_date)>new Date(end_date)){
      alert("Please enter valid dates");
          this.setState({
            isChecked:false
      })
    }else{
      this.setState({
        isChecked:true
      })
      this.display();
    }

  }
  render(){
    var listElements=[];
    // Added `updateComponent={this.state.updateComponent}` rendering 'DonutChart'
    listElements.push(<DonutChart updateComponent={this.state.updateComponent} data={this.state.text} label={this.state.label}/>);
    return(
      <div className="row">
        <div className="col-md-6">
          <input type="text" placeholder="Enter name" id='label' onChange={this.changeText} value={this.state.label}/> 
          <input type='number' id='number'/>
          <label>Start Date:<input type="date" id="start_date"/></label>
          <label>End Date:<input type="date" id="end_date"/></label>
          <button onClick={this.check}>Click here</button>
        </div>
        <div className="col-md-6">
          {listElements}   
        </div>
      </div>
      )

  }
}

App.propTypes={
  text:propTypes.number,
  num:propTypes.number
}



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

ваш DonutChart учебный класс:

import React from 'react';
import ReactDOM from 'react-dom';
//import DonutChart from 'react-donut-chart';
import propTypes from 'prop-types';

class DonutChart extends React.Component{
  componentShouldUpdate(nextProps){ //added
     return nextProps.updateComponent       
  }
  render(){ 
    return(
      <div>
        <span>{this.props.label}</span>
      </div>
    )
  }
}


module.exports={
    DonutChart:DonutChart
}
Другие вопросы по тегам