23.5.2 • Published 7 days ago

@servicetitan/react-ioc v23.5.2

Weekly downloads
938
License
-
Repository
github
Last release
7 days ago

React-ioc

npm version Build Status Coverage Status License

About

React-ioc is an implementation of InversifyJS for react applications.

It uses Context Api of React 16 to manage containers.

Features

  • Supports Hierarchical Dependency Injection.

  • Easy Api that supports Singleton pattern and Transient pattern.

  • Support for decorator and JSX based injection.

  • Automatic cleaning of injected properties on unmounting of React components.

  • Written with typescript i.e. has typings.

Installation

npm i @servicetitan/react-ioc --save

Documentation

@inject

Alias for @inject from InversifyJS.

@injectable

Alias for @injectable from InversifyJS.

Container

Alias for Container from InversifyJS.

@provide

A decorator used to inject the required information in the Provider in the current level of hierarchy.

useDependencies

A Hook that can be used in order to consume IoC container in stateless components.

Provider

A React SFC equivalent to @provide

Examples

  • Store

import { injectable } from '@servicetitan/react-ioc';

@injectable()
export class MySpecialStore {
    public mySpecialValue: string;

    constructor() {
        this.mySpecialValue = 'My Special Text';
    }
}
  • Providing Container with @provide to a component

import {provide, injectDependency} from '@servicetitan/react-ioc';

@provide({
    singletons: [MySpecialStore]
})
class MySpecialComponent extends React.Component {
    render() {
        return <MySpecialSubComponent />;
    }
}
  • Providing container with <Provider>
    <Provider singletons={[MySpecialStore]}>
        <MySpecialComponent />
    </Provider>
  • Any child component can inject MySpecialStore with following syntax without using @provide
class MySpecialSubComponent extends React.Component {
    @injectDependency(MySpecialStore)
    public mySpecialStore: MySpecialStore;

    render() {
        return (
            <span>
                {this.mySpecialStore.mySpecialValue}
            </span>
        );
    }
}
  • For a non react component, we can inject values with @inject inside the container. Like:
class MySpecialConsumerStore {
    private mySpecialStore: MySpecialStore;

    constructor(@inject(MySpecialStore) mySpecialStore: MySpecialStore) {
        this.mySpecialStore = mySpecialStore;
    }
}
  • Accessing container inside React FC.
// with useDependencies hook
const MySpecialSFC = (props) => {
    const [ mySpecialStore ] = useDependencies(MySpecialStore);
    return (
        <div>
            {mySpecialStore.mySpecialValue}
        </div>
    );
};

Using tokens.

Creating a token

// logger.tsx

import { symbolToken, injectDependency, provide, interfaces } from '@servicetitan/react-ioc';

export interface ILogger {
    error(e: Error): void;
}

export const LOGGER_TOKEN = symbolToken<ILogger>('LOGGER_TOKEN');

// injectLoggerDependency decorator
export const injectLoggerDependency = injectDependency(LOGGER_TOKEN);

// provideLogger HOC
export function provideLogger(Logger: interfaces.Newable<ILogger>) {
    return provide({ singletons: [{ provide: LOGGER_TOKEN, useClass: Logger }] });
}

Injecting a service by token

// error-boundary.tsx

import { injectLoggerDependency, ILogger } from './logger'

class ErrorBoundary extends React.Component {
    state = { hasError: false };
    
    @injectLoggerDependency
    logger!: ILogger;
    
    componentDidCatch(e: Error) {
        this.logger.error(e);
        this.setState({ hasError: true });
    }
    
    render() {
        if (this.state.hasError) {
            return (
                <div>Something went wrong...</div>
            );
        }
        
        return this.props.children;
    }
}

Providing a service

// app.tsx

import { ILogger, provideLogger } from './logger';
import { ErrorBoundary } from './error-boundary';

class Logger implements ILogger {
    error(e: Error) {
        console.log(e);
    }
}

const App = provideLogger(Logger)(() => (
    <ErrorBoundary>
        <Router />
    </ErrorBoundary>
));
23.5.1

8 days ago

23.5.2

7 days ago

23.5.0

10 days ago

23.4.0

1 month ago

23.3.0

2 months ago

23.2.3

2 months ago

23.2.2

2 months ago

23.2.1

2 months ago

23.2.0

2 months ago

23.1.0

2 months ago

23.0.0

3 months ago

22.21.0

4 months ago

22.20.0

4 months ago

22.19.0

5 months ago

22.18.0

5 months ago

22.17.0

5 months ago

22.10.0

9 months ago

22.16.0

5 months ago

22.8.2

10 months ago

22.8.1

11 months ago

22.15.0

7 months ago

22.9.0

9 months ago

22.14.0

8 months ago

22.13.0

8 months ago

22.12.0

8 months ago

22.11.0

8 months ago

22.8.0

11 months ago

22.7.0

11 months ago

22.6.1

1 year ago

22.6.0

1 year ago

22.4.0

1 year ago

22.5.1

1 year ago

22.5.0

1 year ago

22.2.1

1 year ago

22.3.0

1 year ago

22.0.3

2 years ago

22.0.5

1 year ago

22.0.4

1 year ago

22.1.0

1 year ago

22.2.0

1 year ago

22.0.2

2 years ago

22.0.1

2 years ago

22.0.0

2 years ago

21.8.0

2 years ago

21.9.0

2 years ago

21.10.0

2 years ago

21.7.3

2 years ago

21.7.2

2 years ago

21.7.1

2 years ago

21.7.0

2 years ago

21.6.0

2 years ago

21.4.1

2 years ago

21.5.0

2 years ago

21.4.0

2 years ago

21.0.0

2 years ago

21.1.0

2 years ago

21.2.0

2 years ago

21.3.1

2 years ago

21.3.0

2 years ago

21.3.2

2 years ago

20.2.0

2 years ago

19.4.0

2 years ago

17.5.6

2 years ago

20.0.1

2 years ago

20.0.0

2 years ago

20.1.0

2 years ago

19.0.0

2 years ago

17.3.2

3 years ago

18.1.0

2 years ago

17.4.0

3 years ago

18.0.0

2 years ago

12.8.13

2 years ago

12.8.12

2 years ago

12.8.14

2 years ago

19.3.0

2 years ago

19.2.0

2 years ago

17.5.0

2 years ago

17.5.5

2 years ago

17.5.1

2 years ago

17.5.4

2 years ago

17.5.3

2 years ago

19.1.0

2 years ago

17.3.1

3 years ago

17.3.0

3 years ago

17.2.1

3 years ago

17.2.0

3 years ago

17.1.1

3 years ago

17.0.1

3 years ago

17.0.0

3 years ago

17.1.0

3 years ago

16.1.0

3 years ago

12.8.8-patch.2

3 years ago

12.8.11

3 years ago

16.0.2

3 years ago

16.0.1

3 years ago

16.0.0

3 years ago

12.8.8-patch.1

3 years ago

12.8.10

3 years ago

12.8.9

3 years ago

15.0.0

3 years ago

12.8.7

3 years ago

12.8.8

3 years ago

12.8.6

3 years ago

14.3.0

3 years ago

12.8.5

3 years ago

14.2.1

3 years ago

14.2.0

3 years ago

14.1.1

3 years ago

14.1.0

3 years ago

12.8.3

3 years ago

12.8.4

3 years ago

10.5.2

3 years ago

14.0.0

3 years ago

13.0.4

3 years ago

13.0.2

3 years ago

13.0.3

3 years ago

13.0.0

3 years ago

13.0.1

3 years ago

12.8.0

3 years ago

12.8.1

3 years ago

12.7.0

3 years ago

12.6.0

3 years ago

12.4.0

3 years ago

10.5.1

3 years ago

12.3.0

3 years ago

12.2.0

3 years ago

12.1.1

3 years ago

12.0.3

3 years ago

12.0.2

3 years ago

10.5.0

3 years ago

12.0.1

3 years ago

12.0.0

3 years ago

11.0.0

3 years ago

10.4.2

3 years ago

10.3.0

3 years ago

10.2.2

3 years ago

10.2.0

3 years ago

10.1.2

3 years ago

10.1.1

3 years ago

10.1.0

3 years ago

10.0.8

3 years ago

10.0.9

3 years ago

10.0.6

3 years ago

10.0.7

3 years ago

10.0.5

3 years ago

10.0.4

3 years ago

10.0.3

3 years ago

10.0.0

3 years ago

10.0.1

3 years ago

10.0.2

3 years ago

10.0.0-alpha.0

3 years ago

9.11.5

3 years ago

9.11.3

3 years ago

9.11.4

3 years ago

9.11.2

3 years ago

9.8.2

3 years ago

9.8.1

3 years ago

9.8.0

3 years ago

9.4.4

4 years ago

9.4.3

4 years ago

9.4.2

4 years ago

9.4.1

4 years ago

9.4.0

4 years ago

9.0.4

4 years ago

9.0.3

4 years ago

9.8.6

3 years ago

9.8.5

3 years ago

9.8.4

3 years ago

9.8.3

3 years ago

8.1.0

4 years ago

8.1.1

4 years ago

9.9.0

3 years ago

9.5.1

3 years ago

9.5.0

3 years ago

9.11.1

3 years ago

9.11.0

3 years ago

9.0.1

4 years ago

9.6.0

3 years ago

9.10.0

3 years ago

9.1.1

4 years ago

9.1.0

4 years ago

9.7.0

3 years ago

8.0.1

4 years ago

8.0.0

4 years ago

9.2.0

4 years ago

7.0.0

4 years ago

6.4.0

4 years ago

6.3.0

4 years ago

6.2.1

4 years ago

6.2.0

4 years ago

6.1.0

4 years ago

6.0.1

4 years ago

6.0.2

4 years ago

6.0.0

4 years ago

5.3.4

4 years ago

5.3.3

4 years ago

5.3.2

4 years ago

5.3.1

4 years ago

5.3.0

4 years ago

5.2.4

4 years ago

5.2.3

4 years ago

5.2.2

4 years ago

5.2.1

4 years ago

5.2.0

4 years ago

5.1.11

4 years ago

5.1.10

4 years ago

5.1.9

4 years ago

5.1.8

4 years ago

5.1.7

4 years ago

5.1.6

4 years ago

5.1.5

4 years ago

5.1.4

4 years ago

5.1.3

4 years ago

5.1.2

4 years ago

5.1.0

4 years ago

5.0.1

4 years ago

5.0.0

4 years ago

4.4.5

4 years ago

4.4.4

4 years ago

4.4.6

4 years ago

4.4.1

4 years ago

4.4.0

4 years ago

4.4.3

4 years ago

4.3.1

4 years ago

4.1.3

4 years ago

4.3.0

4 years ago

4.2.0

4 years ago

4.1.2

4 years ago

4.1.1

4 years ago

3.1.0

4 years ago

4.0.1

4 years ago

4.0.0

4 years ago

4.0.3

4 years ago

3.0.8

4 years ago

3.0.7

4 years ago

3.0.6

4 years ago

3.0.5

4 years ago

3.0.4

4 years ago

3.0.3

4 years ago

3.0.2

4 years ago

3.0.1

4 years ago

3.0.0

5 years ago

2.0.0

5 years ago

1.1.0

5 years ago

1.0.10

5 years ago

1.0.8

6 years ago

1.0.7

6 years ago

1.0.6

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago

0.0.13

6 years ago

0.0.11

6 years ago

0.0.10

6 years ago

0.0.8

6 years ago

0.0.7

6 years ago

0.0.6

6 years ago

0.0.5

6 years ago

0.0.4

6 years ago

0.0.3

6 years ago

0.0.2

6 years ago

0.0.1

6 years ago