Дети Redux - Часть 2: Feeble, vdux и hyperapp
В первой части этих статей мы говорили о Косе, Дутье и два. После небольшого исследования я нашел несколько других, которые можно использовать в приложениях, особенно если вам нужны быстрые решения в процессе создания прототипов вашей разработки.
Вкратце и без каких-либо спойлеров, Feeble здесь для вас, чтобы вы могли использовать его в качестве другого, но более простого типа подхода с неизменяемым состоянием клиента, vdux для предоставления состояний локальных компонентов и управления приложениями, такими как atom и hyperapp, для упрощения процесса разработки, предоставляя такие функции, как Elm. архитектура настолько же функциональна.
Слабый
Библиотека содержит структуру, основанную на сагах React, Redux и Redux. Упрощает реализацию Redux для легкого начала прототипирования чего-либо на основе реализации потока или преобразования / рефакторинга кодовой базы в Feeble.
Еще одна причина использовать Feeble, чтобы поближе познакомиться с некоторыми альтернативными реализациями, основанными на реакции и сокращении. Как и в первой серии этой статьи, вы также легко можете переходить от одного к другому. Он также хорошо работает с React.
Непосредственно перед запуском мы добавляем некоторые зависимости:
import React from 'react' import ReactDOM from 'react-dom' import feeble, { connect } from 'feeble'
Создание экземпляра из слабой функции:
const app = feeble()
Создание модели для нашего примера счетчика, упомянутого также в файле readme репозитория:
const counter = feeble.model({ namespace: 'count', state: 0, })
Вызов ваших действий для объединения с вашими взаимодействиями в пользовательском интерфейсе:
counter.action('increment') counter.action('decrement')
И, конечно же, добавьте в модель редуктор, чтобы эти изменения произошли:
counter.reducer(on => { on(counter.increment, state => state + 1) on(counter.decrement, state => state - 1) })
В конце концов, достаточно привязать вашу модель к вашему приложению:
app.model(counter)
Структурируйте свое дерево представления, открыв новый экземпляр, например под названием «Приложение»:
const App = connect(({ count }) => ({ count }))(function({ dispatch, count }) { return ( <div> <h2>{ count }</h2> <button key="inc" onClick={() => { dispatch(counter.increment()) }}>+</button> <button key="dec" onClick={() => { dispatch(counter.decrement()) }}>-</button> </div> ) })
Теперь мы сопоставляем весь поток данных, привязки и действия с нашим представлением:
const tree = app.mount(<App />)
И визуализируем ваше приложение в DOM:
ReactDOM.render(tree, document.getElementById('app'))
Если вам нужны асинхронные вещи (кто не знает!), Вы можете использовать эффекты, основанные на сагах:
model.effect(function* {
yield* takeEvery(count.increment, function* ({ payload }) {
yield call(localStorage.setItem, 'count', payload)
})
})
Одно из преимуществ использования Feeble - это многоразовые редукторы, подобные приведенным ниже, путем отправки сигналов вашим редукторам прямо на месте:
model.reducer(on => { on(post.fetch.request, state => ({ ...state, loading: true, })) on(post.fetch.success, (state, payload) => ({ ...state, loading: true, data: payload, })) })
Здесь также есть приложение для хакерских новостей, построенное на этой прекрасной структуре.
Вдукс
Связь между redux и DOM как «виртуализированная». Создатель библиотеки считает, что состояние должно быть зависящим от компонента, а глобальное состояние должно изменяться только путем применения подхода рендеринга на стороне сервера, подобного следующему:
function * serverRender () { const {state, html} = yield vdux(<App />) this.body = `<html> <head> <script src='/vdux.js'></script> <script src='/app.js'></script> <script> vdux(() => <App />, { initialState: ${JSON.stringify(state), prerendered: true }) </script> </head> <body> ${html} </body> </html>` }
Базовый пример счетчика для лучшего понимания подхода говорит нам, что он использует терминологию Redux, такую как редукторы и действия для запуска, чтобы также обновить локальное состояние:
const TinyComponent = component({ render ({state, actions}) { return <div onClick={actions.increment}>Value: {state.value}</div> }, reducer: { increment: state => ({ value: state.value + 1 }) } }
Для создания виртуально сгенерированной модели DOM и управления ею вам нужны только две основные функции библиотеки: компонент и элемент:
import {component, element} from 'vdux'
Затем достаточно вернуть наш крошечный компонент в качестве возвращаемого значения функции vdux:
import vdux from 'vdux/dom' vdux(() => <TinyComponent />)
Гиперапп
Эта библиотека предоставляет еще одну функциональность «plug & play» для ваших вечнозеленых приложений, в которых вы надеетесь воплотить в жизнь некоторые инновационные идеи! Он уже такой крошечный, как 1 КБ, и минимизирован, как указано в файле readme репозитория:
HyperApp родился из попытки делать больше с меньшими затратами.
HyperApp полностью вдохновлен архитектурой Elm и простотой работы с парадигмой функционального программирования, как это упоминается в том же файле readme.
Использование этой библиотеки означает, что вы можете видеть все, что происходит у вас перед глазами, например, действия, фактическую DOM вашего компонента и состояние. Это все, что нам нужно, правда?
app({ state: { count: 0 }, view: (state, actions) => <main> <h1>{state.count}</h1> <button onclick={actions.down}>ー</button> <button onclick={actions.up}>+</button> </main>, actions: { down: state => ({ count: state.count - 1 }), up: state => ({ count: state.count + 1 }) } })
Вы можете объявлять «тупые» компоненты и использовать их в любой структуре приложения:
const DumbComponent = ({ name, title, url }) => <h1> <a href={url}>{name}, {title}</a> </h1>
Каждый созданный виртуальный узел состоит из трех основных частей: тега, данных, дочерних элементов:
{ tag: "div", data: { id: "some" }, children: [{ tag: "p", data: null, children: ["Some paragraph."] }] }
И это дает следующее. Вы также можете использовать функцию h, чтобы воспроизвести виртуальную модель DOM, как то же самое:
<div id="some"> <p>Some paragraph.</p> </div>
Итак, как насчет методов жизненного цикла компонентов? Все они предоставляются библиотекой для обработки всех шагов компонента: загрузка для начального момента рендеринга приложения, действие для проверки событий непосредственно перед вызовом, разрешение для проверки результатов действий, обновление для отслеживания и выполнения действий во время происходящих изменений и рендеринга для переопределения функции просмотра перед ее вызовом.
Вот и площадка для гиперпарапа.
Надеюсь, вам понравилась статья! Спасибо за чтение и до встречи в следующей серии.
Примечание. Если вам понравился этот пост, ❤ поделитесь им в Твиттере или сделайте что-нибудь! :)