_render() {
      const ctor = this.constructor;
      const hasIndividualSlots = ctor.getMetadata().hasIndividualSlots();
      // suppress invalidation to prevent state changes scheduling another rendering
      this._suppressInvalidation = true;
      this.onBeforeRendering();
      // Intended for framework usage only. Currently ItemNavigation updates tab indexes after the component has updated its state but before the template is rendered
      if (this._onComponentStateFinalized) {
        this._onComponentStateFinalized();
      }
      // resume normal invalidation handling
      this._suppressInvalidation = false;
      // Update the shadow root with the render result
      /*
      if (this._changedState.length) {
          let element = this.localName;
          if (this.id) {
              element = `${element}#${this.id}`;
          }
          console.log("Re-rendering:", element, this._changedState.map(x => { // eslint-disable-line
              let res = `${x.type}`;
              if (x.reason) {
                  res = `${res}(${x.reason})`;
              }
              res = `${res}: ${x.name}`;
              if (x.type === "property") {
                  res = `${res} ${JSON.stringify(x.oldValue)} => ${JSON.stringify(x.newValue)}`;
              }
               return res;
          }));
      }
      */
      this._changedState = [];
      // Update shadow root and static area item
      if (ctor._needsShadowDOM()) {
        (0, _updateShadowRoot.default)(this);
      }
      if (this.staticAreaItem) {
        this.staticAreaItem.update();
      }
      // Safari requires that children get the slot attribute only after the slot tags have been rendered in the shadow DOM
      if (hasIndividualSlots) {
        this._assignIndividualSlotsToChildren();
      }
      // Call the onAfterRendering hook
      this.onAfterRendering();
    }
Do not call this method directly, only intended to be called by js
@protected