Pull to refresh
40
0
Антон Жуков @MrCheater

Team Leader, Full-Stack JS, React, Node.JS

Send message
С более сложным примером, где было бы больше веток и больше состояний, нас ждал бы Комбинаторный взрыв. Пришлось бы писать огромное количество тестов. И их количество было бы неустойчиво к рефакторингу. Добавил одну вилку в любую функцию — нужно удвоить общее количество тестов, что не есть хорошо.
Пользуясь случаем — очень ждем фичу «Несколько авторов у одной статьи»! Удачи Хабр!
Так медленно не создание новой функции. Медленно отрывать от DOM узла одну функцию и всаживать другую.

Нужно создавать заранее замкнутые на props колбеки и дальше уже их всем кому надо прокидывать.
В React-Redux из коробки есть connectAdvanced для таких вещей https://github.com/reactjs/react-redux/blob/master/docs/api.md#examples-1

Ещё вот это антипаттерн:


<button onClick={() => likeArticle(article)} />

На каждый рендеринг компонента создается новая функция, и изменения доходят вплоть до настоящего DOM браузера, а это дорого.

Презентационные компоненты знают о домене и сервисах. Так быть не должно.


// ArticleComponent.js:

import type {Article} from "../domain/Article";
import * as articleUiService from "../services/ArticleUiService";

Почитайте Дэна Абрамова https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0. Он определяет чёткие признаки, того чем Контейнеры о Компонентов отличаются.


// ArticleContainer.js:

import {articleStore} from "../store/ArticleStore";

Для серьезного проекта это тоже неуместно. Получается, что articleStore это глобальный объект. И это работает только потому, что один браузер — один инстанс store. Если захочется, сделать Server Side Rendering, то придется весь код выбрасывать. Ибо там один инстанс сервера — множество инстансов store. Рекомендуется для пробрасывания store использовать Context API .

Хочу обратить внимание, что я не автор. А это перевод.
Но с React/Redux работаю давно. И архитектура React не позволит некоторые "упрощения" hyperapp реализовать. Например, автоматический биндинг action creators сделать не получится без каких-то серьезных проломов и глобальных переменных. Максимум, что-то похожее можно отыскать тут redux-actions.
А в остальном вы правы, что-то похожее можно и на React/Redux изобразить, если приложить усилий. Думаю, в hyperapp упор именно на "изкоробочность".

По-идее — в объекте actions будут лежать обертки, которые не требуют ручной передачи state

  1. Интерфейс дергает upLater
  2. upLater ждет секунду и дергает up
  3. up меняет state
  4. Интерфейс обновляется

Как-то так:


const actions = {
  upLater: value => (state, actions) => {
    setTimeout(actions.up, 1000, value)
  },
  // Called one second after upLater
  up: value => state => ({ count: state.count + value })
}

P.S. — добавил пример в текст статьи

Может и сложновато, зато единообразно во всех приложениях всегда. Для кого-то это будет плюсом

То, что только рут компонент является "умным", а все дочерние "глупыми" — нормально. Многие и на React/Redux так пишут

Одному из первых довелось прочитать эту книгу. Хорошее руководство для начинающего frontend-разработчика. Здесь обо всём понемногу. Для быстрого старта это самое то.
Свежий React+Redux на практике; Введение в функциональное программирование; Новый синтаксис ES6, JSX; Общие сведения про тестирование и линтинг (Jest + ESLint); Новый React-Router (v4); И даже раскрыта тема изоморфных приложений и Server Side Rendering.

sinopia имеет проблемы с пакетами вида @somescope/somepackagename
Разработчики забили на поддержку.
Вот живой и поддерживаемый форк verdaccio (1700+ звёзд)

Хочу дополнить тему "Преобразование коллбэков в промисы"
Так как написано в статье, делать нынче уже не принято. Есть util.promisify

Что-то http://toys.hyoo.ru/ безбожно тормозит при скролинге. Какая-то анти-реклама $mol

Под Linux нет нативной версии, и голосовые звонки в веб-версии не работают

Information

Rating
Does not participate
Location
Тула, Тульская обл., Россия
Date of birth
Registered
Activity