Basic example
The classic example of a counter
- How to create a simple service and bind it to your React app
- Familiarity with Typescript
- Familiarity with Typescript class syntax
The service
Create the new service
First we create the file counter.service.ts
The created service must extend Service
which has been auto-generated in the setup step
export class CounterService extends Service {
}
Service state
Each service has a local state, it is referenced as initialState which must be static
Pass the State
type to the extended Service as Service<State>
type State = { count: number };
export class CounterService extends Service<State> {
static initialState: State = { count: 0 };
}
Append a method
Each method has access to the local state as an observable
To access a local state use its method get
To modify a local state use its method set
type State = { count: number };
export class CounterService extends Service<State> {
static initialState: State = { count: 0 };
increment() {
this.state.count.set((count) => count + 1);
}
}
Register the service
In the file _services
import { CounterService } from './counter.service';
export const services = {
counter: CounterService,
};
Wrap the App with the CortexProvider
<CortexProvider coreInstance={new Core()}>
<App />
</CortexProvider>
Use the methods in the app
Use the hook useService
with the name of the service, here counter
You can access any method by destructuring this hook return value, and use it in the JSX
const InnerApp: FC = () => {
const { increment } = useService('counter');
return (
<div>
<button onClick={increment}>increment counter value</button>
</div>
);
};
Access the state in the app
You can access to any value thanks to the useAppSelector, anytime the value store.counter.count
changes, the value will be re-rendered in the JSX
const InnerApp: FC = () => {
const { increment } = useService('counter');
const count = useAppSelector((store) => store.counter.count.get());
return (
<div>
<button onClick={increment}>+</button>
<span>{count}</span>
</div>
);
};
Test the behavior
Since all the logic is completely decoupled from React, we can test the behavior of our app with Jest
describe('counter', () => {
it('should be incremented', () => {
const core = new Core()
expect(core.store.counter.get()).toBe(0)
core.getService("counter").increment()
expect(core.store.counter.get()).toBe(1)
})
})