docs: function (transaction, prevElement, nextElement, context) {
      var lastProps = prevElement.props;
      var nextProps = this._currentElement.props;
  
      switch (this._tag) {
        case 'button':
          lastProps = ReactDOMButton.getHostProps(this, lastProps);
          nextProps = ReactDOMButton.getHostProps(this, nextProps);
          break;
        case 'input':
          lastProps = ReactDOMInput.getHostProps(this, lastProps);
          nextProps = ReactDOMInput.getHostProps(this, nextProps);
          break;
        case 'option':
          lastProps = ReactDOMOption.getHostProps(this, lastProps);
          nextProps = ReactDOMOption.getHostProps(this, nextProps);
          break;
        case 'select':
          lastProps = ReactDOMSelect.getHostProps(this, lastProps);
          nextProps = ReactDOMSelect.getHostProps(this, nextProps);
          break;
        case 'textarea':
          lastProps = ReactDOMTextarea.getHostProps(this, lastProps);
          nextProps = ReactDOMTextarea.getHostProps(this, nextProps);
          break;
      }
  
      assertValidProps(this, nextProps);
      this._updateDOMProperties(lastProps, nextProps, transaction);
      this._updateDOMChildren(lastProps, nextProps, transaction, context);
  
      switch (this._tag) {
        case 'input':
          // Update the wrapper around inputs *after* updating props. This has to
          // happen after `_updateDOMProperties`. Otherwise HTML5 input validations
          // raise warnings and prevent the new value from being assigned.
          ReactDOMInput.updateWrapper(this);
          break;
        case 'textarea':
          ReactDOMTextarea.updateWrapper(this);
          break;
        case 'select':
          // <select> value update needs to occur after <option> children
          // reconciliation
          transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this);
          break;
      }
    }