public void Invoke() { Cleanup(); using (_element.Bind(_node, false)) _cleanup = _effect?.Invoke(); }
/// <summary> /// Renders the given element. /// </summary> public virtual RenderResult RenderElement(ofElement element) { bool shouldRender; // remove first to avoid infinite rerender loop lock (Root.RerenderNodes) shouldRender = Root.RerenderNodes.Remove(this); if (_disposed) { return(RenderResult.Mismatch); } if (!CanRender(element)) { return(RenderResult.Mismatch); } shouldRender = shouldRender || AlwaysInvalid || Element == null || Element.ShouldComponentUpdate(element); if (!shouldRender) { Root.Diagnostics?.OnNodeRenderSkipped(this); return(RenderResult.Skipped); } // enable hooks _hooks = 0; try { using (element.Bind(this)) { Root.Diagnostics?.OnNodeRendering(this); var result = element.RenderSubtree(); if (result && ofElement.IsHookValidated) { if (_lastHook == null) { _lastHook = _hooks; } else if (_lastHook != _hooks) { throw new InvalidOperationException($"The number of hooks ({_hooks}) does not match with the previous render ({_lastHook}). " + "See https://reactjs.org/docs/hooks-rules.html for rules about hooks."); } } return(result ? RenderResult.Rendered : RenderResult.Skipped); } } catch (Exception e) { Root.Diagnostics?.OnException(e); throw; } finally { _hooks = null; } }