30.3.0 • Published 8 days ago

@servicetitan/react-ioc v30.3.0

Weekly downloads
938
License
-
Repository
github
Last release
8 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>
));
28.3.1

5 months ago

28.3.2

5 months ago

28.3.0

6 months ago

28.3.3

5 months ago

30.3.0

8 days ago

28.2.0

6 months ago

30.2.1

17 days ago

30.2.0

21 days ago

28.5.0

4 months ago

30.1.2

28 days ago

30.1.0

1 month ago

30.1.1

1 month ago

29.0.0

3 months ago

28.4.0

4 months ago

30.0.0

2 months ago

28.1.0

7 months ago

28.1.1

7 months ago

28.0.0

7 months ago

27.4.0

8 months ago

27.3.0

8 months ago

27.2.1

9 months ago

27.2.0

9 months ago

25.1.0

11 months ago

24.3.0

11 months ago

25.0.0

11 months ago

24.2.0

11 months ago

26.1.0

10 months ago

26.0.2

10 months ago

26.0.1

10 months ago

26.0.0

10 months ago

24.4.0

11 months ago

26.3.0

10 months ago

27.1.0

9 months ago

27.1.1

9 months ago

26.2.0

10 months ago

27.0.0

10 months ago

24.1.3

12 months ago

24.1.2

12 months ago

24.1.1

12 months ago

24.1.0

12 months ago

26.4.0

10 months ago

24.0.4

1 year ago

24.0.3

1 year ago

24.0.2

1 year ago

24.0.1

1 year ago

24.0.0

1 year ago

23.6.0

1 year ago

23.5.1

1 year ago

23.5.2

1 year ago

23.5.0

1 year ago

23.4.0

1 year ago

23.3.0

1 year ago

23.2.3

1 year ago

23.2.2

1 year ago

23.2.1

1 year ago

23.2.0

1 year ago

23.1.0

1 year ago

23.0.0

1 year ago

22.21.0

1 year ago

22.20.0

1 year ago

22.19.0

1 year ago

22.18.0

1 year ago

22.17.0

2 years ago

22.10.0

2 years ago

22.16.0

2 years ago

22.8.2

2 years ago

22.8.1

2 years ago

22.15.0

2 years ago

22.9.0

2 years ago

22.14.0

2 years ago

22.13.0

2 years ago

22.12.0

2 years ago

22.11.0

2 years ago

22.8.0

2 years ago

22.7.0

2 years ago

22.6.1

2 years ago

22.6.0

2 years ago

22.4.0

2 years ago

22.5.1

2 years ago

22.5.0

2 years ago

22.2.1

3 years ago

22.3.0

2 years ago

22.0.3

3 years ago

22.0.5

3 years ago

22.0.4

3 years ago

22.1.0

3 years ago

22.2.0

3 years ago

22.0.2

3 years ago

22.0.1

3 years ago

22.0.0

3 years ago

21.8.0

3 years ago

21.9.0

3 years ago

21.10.0

3 years ago

21.7.3

3 years ago

21.7.2

3 years ago

21.7.1

3 years ago

21.7.0

3 years ago

21.6.0

3 years ago

21.4.1

3 years ago

21.5.0

3 years ago

21.4.0

3 years ago

21.0.0

3 years ago

21.1.0

3 years ago

21.2.0

3 years ago

21.3.1

3 years ago

21.3.0

3 years ago

21.3.2

3 years ago

20.2.0

3 years ago

19.4.0

3 years ago

17.5.6

3 years ago

20.0.1

3 years ago

20.0.0

3 years ago

20.1.0

3 years ago

19.0.0

4 years ago

17.3.2

4 years ago

18.1.0

4 years ago

17.4.0

4 years ago

18.0.0

4 years ago

12.8.13

4 years ago

12.8.12

4 years ago

12.8.14

4 years ago

19.3.0

3 years ago

19.2.0

3 years ago

17.5.0

4 years ago

17.5.5

4 years ago

17.5.1

4 years ago

17.5.4

4 years ago

17.5.3

4 years ago

19.1.0

4 years ago

17.3.1

4 years ago

17.3.0

4 years ago

17.2.1

4 years ago

17.2.0

4 years ago

17.1.1

4 years ago

17.0.1

4 years ago

17.0.0

4 years ago

17.1.0

4 years ago

16.1.0

4 years ago

12.8.8-patch.2

4 years ago

12.8.11

4 years ago

16.0.2

4 years ago

16.0.1

4 years ago

16.0.0

4 years ago

12.8.8-patch.1

4 years ago

12.8.10

4 years ago

12.8.9

4 years ago

15.0.0

4 years ago

12.8.7

4 years ago

12.8.8

4 years ago

12.8.6

4 years ago

14.3.0

4 years ago

12.8.5

4 years ago

14.2.1

4 years ago

14.2.0

4 years ago

14.1.1

4 years ago

14.1.0

4 years ago

12.8.3

4 years ago

12.8.4

4 years ago

10.5.2

4 years ago

14.0.0

4 years ago

13.0.4

4 years ago

13.0.2

4 years ago

13.0.3

4 years ago

13.0.0

4 years ago

13.0.1

4 years ago

12.8.0

4 years ago

12.8.1

4 years ago

12.7.0

4 years ago

12.6.0

4 years ago

12.4.0

4 years ago

10.5.1

4 years ago

12.3.0

4 years ago

12.2.0

4 years ago

12.1.1

4 years ago

12.0.3

4 years ago

12.0.2

4 years ago

10.5.0

4 years ago

12.0.1

4 years ago

12.0.0

4 years ago

11.0.0

4 years ago

10.4.2

4 years ago

10.3.0

4 years ago

10.2.2

4 years ago

10.2.0

4 years ago

10.1.2

4 years ago

10.1.1

4 years ago

10.1.0

4 years ago

10.0.8

4 years ago

10.0.9

4 years ago

10.0.6

4 years ago

10.0.7

4 years ago

10.0.5

4 years ago

10.0.4

4 years ago

10.0.3

4 years ago

10.0.0

4 years ago

10.0.1

4 years ago

10.0.2

4 years ago

10.0.0-alpha.0

4 years ago

9.11.5

4 years ago

9.11.3

4 years ago

9.11.4

4 years ago

9.11.2

4 years ago

9.8.2

4 years ago

9.8.1

4 years ago

9.8.0

5 years ago

9.4.4

5 years ago

9.4.3

5 years ago

9.4.2

5 years ago

9.4.1

5 years ago

9.4.0

5 years ago

9.0.4

5 years ago

9.0.3

5 years ago

9.8.6

4 years ago

9.8.5

4 years ago

9.8.4

4 years ago

9.8.3

4 years ago

8.1.0

5 years ago

8.1.1

5 years ago

9.9.0

4 years ago

9.5.1

5 years ago

9.5.0

5 years ago

9.11.1

4 years ago

9.11.0

4 years ago

9.0.1

5 years ago

9.6.0

5 years ago

9.10.0

4 years ago

9.1.1

5 years ago

9.1.0

5 years ago

9.7.0

5 years ago

8.0.1

5 years ago

8.0.0

5 years ago

9.2.0

5 years ago

7.0.0

5 years ago

6.4.0

5 years ago

6.3.0

5 years ago

6.2.1

5 years ago

6.2.0

5 years ago

6.1.0

5 years ago

6.0.1

5 years ago

6.0.2

5 years ago

6.0.0

5 years ago

5.3.4

5 years ago

5.3.3

5 years ago

5.3.2

5 years ago

5.3.1

5 years ago

5.3.0

5 years ago

5.2.4

5 years ago

5.2.3

5 years ago

5.2.2

5 years ago

5.2.1

5 years ago

5.2.0

5 years ago

5.1.11

5 years ago

5.1.10

5 years ago

5.1.9

5 years ago

5.1.8

5 years ago

5.1.7

5 years ago

5.1.6

5 years ago

5.1.5

5 years ago

5.1.4

5 years ago

5.1.3

5 years ago

5.1.2

5 years ago

5.1.0

5 years ago

5.0.1

5 years ago

5.0.0

5 years ago

4.4.5

5 years ago

4.4.4

5 years ago

4.4.6

5 years ago

4.4.1

5 years ago

4.4.0

5 years ago

4.4.3

5 years ago

4.3.1

5 years ago

4.1.3

5 years ago

4.3.0

5 years ago

4.2.0

5 years ago

4.1.2

5 years ago

4.1.1

5 years ago

3.1.0

5 years ago

4.0.1

5 years ago

4.0.0

5 years ago

4.0.3

5 years ago

3.0.8

5 years ago

3.0.7

5 years ago

3.0.6

5 years ago

3.0.5

5 years ago

3.0.4

5 years ago

3.0.3

5 years ago

3.0.2

5 years ago

3.0.1

5 years ago

3.0.0

6 years ago

2.0.0

6 years ago

1.1.0

6 years ago

1.0.10

6 years ago

1.0.8

7 years ago

1.0.7

7 years ago

1.0.6

7 years ago

1.0.5

7 years ago

1.0.4

7 years ago

1.0.3

7 years ago

1.0.2

7 years ago

1.0.1

7 years ago

1.0.0

7 years ago

0.0.13

7 years ago

0.0.11

7 years ago

0.0.10

7 years ago

0.0.8

7 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago