<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>React App</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      fields: {
        message: ''
      },
      message: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
    }
  }

  handleMessageChange = (e) => {
    this.setState({
      fields: {
        message: e.target.value
      }
    });
  }
  
  submitMessage = (e) => {
    e.preventDefault();
    this.setState({
      message: this.state.fields.message
    });
  }

  render() {
    return (
      <div>
        Enter new message: 
        <input type="text" value={this.state.fields.message} onChange={this.handleMessageChange} />
        <button onClick={this.submitMessage}>Save</button><br /><br />
        <ChildComponent message={this.state.message}/>
      </div>
    );
  }
}

let childComponentRenderCount = 0;

class ChildComponent extends React.Component {
  render () {
    childComponentRenderCount++;
    return (
      <div>
        The message is: {this.props.message}<br />
        Render count: {childComponentRenderCount}
      </div>
    )
  }
}

ChildComponent.propTypes = {
  message: PropTypes.string
}

ReactDOM.render(<App />, document.getElementById('root'));
View Compiled
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js
  3. https://cdnjs.cloudflare.com/ajax/libs/prop-types/15.7.2/prop-types.min.js