Комментарии 6
Даже не верится, что Раян такую глупость написал.
В Реакте как раз пуш подход: пропсы пушатся во вложенные компоненты. Зависимости вручную приходится описывать ровно по той же причине - тем самым мы говорим какое значение пушить в стейт - то, которое мы ему передали или то, которое там уже есть.
А "сигнали" - это просто пулл. Синхронное распространение уведомлений об изменениях никакого отношения к прикладной логине не имеет - она именно пуллится.
Да, понимаю, почему кажется, что в React push подход.
Например пропсы передаются вниз по дереву, а зависимости в хуках типа useEffect выглядят как управление тем, что пушить в стейт. Но если копнуть глубже, React ближе к pull-based системе. Компоненты сами запрашивают данные (пропсы и состояние) на момент рендера, а не получают их асинхронно, как в push системах вроде RxJS. Зависимости в хуках — это больше про оптимизацию и контроль, а не про пуш данных. Хотя, если смотреть со стороны системы, React инициирует рендеринг, что можно интерпретировать как push. Но с точки зрения данных и компонентов— это скорее pull.
Так что Раян, может, и не совсем глупость написал, просто другой угол зрения.
Компоненты как раз ничего не запрашивают, а в них проталкивают значение сверху вниз. В то время как у Solid пропсы это Pull-based так как они ленивы и значение пропса вычисляется только в момент попытки обращения значению пропса.
Нужно нехилую ментальнужю гимнастику применить, чтобы хоть как-то натянуть модель реактивности React на Pull-семантику. А если с точки зрения вычисления смотреть, то это прям совсем push push
Простой пример:
function TodoList({ todos, tab }) { // нам пропушили пропсы
const visibleTodos = useMemo(
() => filterTodos(todos, tab), // мы пропушили пропсы в замыкание
[todos, tab]
); // сказали реакту, что при изменении пропсов надо обновить список
return <div>{tab}</div> // далее список никак не использовали, но пропушили пропс
}
Это всё буквально push. В более традиционном виде эта процедура писалась бы так:
updatePops({ todos, tab }) {
if( !equal( this.props.todos, todos ) || !equal( this.props.tab, tab ) ) {
this.visibleTodos = this.filterTodos( todos, tab )
}
reconcile( this.dom, this.vdom, this.vdom = <div>{tab}</div> )
}
Был у меня хороший сэндбокс для проверки и экспериментов с различними моделями при реализации динамического списка туду. Пока сделал в лоб, но там поле не пахано.
Если вам интересно, посмотрите библиотеку Fusorjs, где можно интегрировать любой вариант реактивности или без реактивности. И там будет real-world приложение todomvc.
Без реактивности кстати тоже можно вполне комфортно решать задачи.
Понимая реактивные системы: Производные, эффекты и оптимизация