 
 		let oldComponent = old as! Component
 
+		let shouldRender = componentShouldRender(oldComponent, previousState: oldComponent.state)
+
 		parent = oldComponent.parent
 		root = oldComponent.root
 		state = oldComponent.state
 		rootElement = oldComponent.rootElement
 		realizedRoot = oldComponent.realizedRoot
 
-		renderNewRoot()
+		if shouldRender {
+			renderNewRoot()
+		}
 	}
 	
 	public override func realize(parent: RealizedElement?) -> RealizedElement {

	/// *should* based on the new state.
	///
	/// The default implementation always returns true.
	public func componentShouldRender(previousState: S, newState: S) -> Bool {
		return true
	}
	

	final public func updateState(fn: S -> S) {
		precondition(NSThread.isMainThread(), "Component.updateState called on a background thread. Donut do that!")

		state = fn(state)
		
		enqueueRender()
	}

	final public func modifyState(fn: inout S -> ()) {
		precondition(NSThread.isMainThread(), "Component.modifyState called on a background thread. Donut do that!")

		fn(&state)

		enqueueRender()
	}

	final private func enqueueRender() {
