1.1.1 • Published 9 years ago
reactive-di-react v1.1.1
reactive-di-react
react bindings for reactive-di
Features:
- Flowtype used for jsx props checking and resolving dependencies.
- React-related code moved from application to reactive-di-react. In application we use only jsx and pure functions.
- Dependencies mixed with props: just declare all them in interface of widget arguments.
- All widgets are statefull and listens only related changes via. reactive-di-observable: virtual dom is unnecessary. You don't need pass dependencies in props from hiorder to underlayer widgets.
- You don't need non-standard type-checking methods like React.PropTypes, use flowtype and babel-plugin-typecheck.
- reactBrowserRenderer helper to less boilerplate code
Define interfaces:
// @flow
// interfaces.js
export type Translate = (message: string) => string;
export type EditTodo = (id: string) => void;
export type TodoItem = {
id: string;
title: string;
isCompleted: boolean;
}
export type TodoItemCollection = Array<TodoItem>;
Define todo element component
Use babel-plugin-react-require to autoimport react. Dependencies mixed with call-time arguments in function options. To separate dependencies use intersection of flow types or magic '@args' comment (see more babel-plugin-transform-metadata).
// @flow
// TodoElement.js
import type {
TodoItem,
EditTodo
} from './interfaces'
import type {
Component,
Element
} from 'reactive-di-react'
type Props = {
item: TodoItem;
}
// To support TodoElement properties in flow jsx.
export type ITodoElement = Component<Props>;
type TodoElementProps = Props & {
t: Translate,
editTodo: EditTodo
}
export default function TodoElement({
item,
t,
editTodo
}: TodoElementProps): Element {
return (
<div>
<h1>{item.title}</h1>
<div>
<a onClick={() => editTodo(item.id)}>{t('edit')}</a>
</div>
</div>
)
}
Define todo element list
All child widgets injects via di:
// @flow
// TodoElementList.js
import type {
TodoItemCollection
} from 'reactive-di-todomvc/todo'
import type {
Component,
Element
} from 'reactive-di-react'
import type {ITodoElement} from './TodoElement'
type TodoElementListProps = {
TodoElement: ITodoElement;
data: TodoItemsFacet
};
// Needed for flow support in jsx.
export type ITodoElementList = Component<void>;
export default function TodoElementList({
data,
TodoItemCollection
}: TodoElementListProps): Element {
return (
<ul className="todo-list">
{data.items.map((item) => <TodoElement item={item} key={item.id} />)}
</ul>
)
}
Setup in reactive-di
// @flow
// main.js
import type {
Container,
ConfigItem,
ContainerManager,
CreateContainerManager
} from 'reactive-di'
import type {Renderer} from 'reactive-di-react'
import type {ITodoElementList} from './TodoElementList'
import type {ITodoElement} from './TodoElement'
import _ from 'babel-plugin-transform-metadata/_'
import {
createManagerFactory,
defaultPlugins,
createHotRelationUpdater
} from 'reactive-di'
import {observablePlugins} from 'reactive-di-observable'
import {component} from 'reactive-di-react/configurations'
import {
createReactBrowserRenderer,
ReactPlugin
} from 'reactive-di-react'
const deps: Array<ConfigItem> = [
[(_: ITodoElement), component(TodoElement)],
[(_: ITodoElementList), component(TodoElementList)]
]
const createContainerManager: CreateContainerManager = createManagerFactory(
defaultPlugins.concat([ReactPlugin], observablePlugins)
);
const appCm: ContainerManager = createContainerManager(deps);
const di: Container = appCm.createContainer();
const render: Renderer = createReactBrowserRenderer(
di,
document.getElementById('app')
);
render((_: ITodoElementList))
Full example in todomvc.
1.1.1
9 years ago
1.1.0
9 years ago
1.0.13
9 years ago
1.0.12
9 years ago
1.0.11
9 years ago
1.0.10
9 years ago
1.0.9
9 years ago
1.0.8
9 years ago
1.0.7
9 years ago
1.0.6
9 years ago
1.0.5
9 years ago
1.0.4
9 years ago
1.0.3
9 years ago
1.0.2
9 years ago
1.0.1
9 years ago
1.0.0
9 years ago
0.0.12
9 years ago
0.0.11
10 years ago
0.0.10
10 years ago
0.0.9
10 years ago
0.0.8
10 years ago
0.0.7
10 years ago
0.0.6
10 years ago
0.0.5
10 years ago
0.0.4
10 years ago
0.0.3
10 years ago
0.0.2
10 years ago