ditox-react
Version:
Dependency injection container for React.js
117 lines (89 loc) • 3.36 kB
Markdown
<img alt="lemon" src="https://raw.githubusercontent.com/mnasyrov/ditox/master/lemon.svg" width="120" />
**Dependency injection container for React.js**
Please see the documentation at [ditox.js.org](https://ditox.js.org)
[](https://www.npmjs.com/package/ditox)
[](https://github.com/mnasyrov/ditox/stargazers)
[](https://www.npmjs.com/package/ditox)
[](https://github.com/mnasyrov/ditox/blob/master/LICENSE)
[](https://coveralls.io/github/mnasyrov/ditox)
You can use the following command to install this package:
```shell
npm install --save ditox-react
```
The packages can be used as [UMD](https://github.com/umdjs/umd) modules. Use
[](https://jsdelivr.com) CDN site to load
[](https://www.jsdelivr.com/package/npm/ditox) and
[](https://www.jsdelivr.com/package/npm/ditox-react):
```html
<script src="//cdn.jsdelivr.net/npm/ditox/dist/umd/index.js" />
<script src="//cdn.jsdelivr.net/npm/ditox-react@2.3.0/dist/umd/index.js" />
<script>
const container = Ditox.createContainer();
// DitoxReact.useDependency(SOME_TOKEN);
</script>
```
`ditox-react` is a set of helpers for providing and using a dependency container
in React apps:
- Components:
- `DepencencyContainer` - provides a new or existed container to React
components.
- `DepencencyModule` - binds a dependency module to a new container.
- `CustomDepencencyContainer` - provides an existed dependency container.
- Hooks:
- `useDependencyContainer()` - returns a provided dependency container.
- `useDependency()` - returns a resolved value by a specified token. It throws
an error in case a container or value is not found.
- `useOptionalDependency()` - returns a resolved value by a specified token,
or returns `undefined` in case a container or value is not found.
```jsx
import {token} from 'ditox';
import {
DependencyContainer,
useDependency,
useDependencyContainer,
useOptionalDependency,
} from 'ditox-react';
const FOO_TOKEN = token();
const BAR_TOKEN = token();
function appDependencyBinder(container) {
container.bindValue(FOO_TOKEN, 'foo');
}
function App() {
return (
<DependencyContainer binder={appDependencyBinder}>
<NestedComponent />
</DependencyContainer>
);
}
function NestedComponent() {
// Get access to the container
const container = useDependencyContainer();
// Use a resolved value
const foo = useDependency(FOO_TOKEN);
// Use an optional value. It is not provided in this example.
const bar = useOptionalDependency(BAR_TOKEN);
useEffect(() => {
console.log({foo, bar}); // {foo: 'foo', bar: undefined}
}, [foo, bar]);
return null;
}
```
Dependency modules can be provided to the app with `<DependencyModule />`
component:
```tsx
function App() {
return (
<DependencyModule module={LOGGER_MODULE}>
<NestedComponent />
</DependencyModule>
);
}
```
---
This project is licensed under the
[](https://github.com/mnasyrov/ditox/blob/master/LICENSE).