Как стать автором
Обновить

Комментарии 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.

Без реактивности кстати тоже можно вполне комфортно решать задачи.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий