Reactive component trees using a virtual DOM