если я в цикле добавлю 1000 элементов в массив, то страница перерисуется 1000 раз, в ангуляре 1 (могу ошибаться).
перерисовка происходит только один раз, компонентом изменяеться лишь виртуальный дум, потом виртуальный дум сопоставляеться со старой копией виртуального дума и вычисляются различия. Эти различия применяются к реальному думу.
То есть в отличии от ангуляра reactjs не имеет дела с реальным dom а выполняет все операции на виртуальном, реальный дум reactjs мочит не заботясь о нем ни как, все что ему интересно он хранит в виртуальном. Тоесть если к реальному думу сгенерированным реактом привязать jQuery плагин тот реакт грохнет этот дум вместе с плагином не поморщившись тогда когда ему этого захочется (он сам решает что и когда перерисовывать в ответ на изменение состояния компонента). Поэтому все операции на реальном думе выполняются в специальнм келбеке который вызывается после рендеренга (но это нужно разве только чтобы какой нибудь jQuery плагин заюзать).
Чтобы события не отваливались вместе с безжалостно убитым думом то все события слушаются по факту на documents, оборачиваются в синтетические и скармливаются слушателям в компоненте. Хотя для программиста это выглядет так как будто это подписка в шаблоне. Побочным приятным эффектом является универсализация событий для всех браузеров.
Так как с данными в памяти работы быстрее чем с реальным думом то у reactjs хороший профит по производительности.
http://jsperf.com/angular-vs-knockout-vs-ember/302
Еще большой плюс в том что у реакта ниже порог вхождения тобишь он ощутимо проще ангуляра. Но реакт заточен только под UI в то время как ангуляр предлагает функционал для построения всего приложения.
И строго говоря это не датабиндинг, хотя есть аддон LinkedStateMixin и если его примешать к классу то можно замутить двухсторонний биндинг состояния с каким нибудь инпутом.