RxAngular offers a comprehensive toolkit for handling fully reactive Angular applications with the main focus on runtime performance, template rendering, and Developer eXperience.
RxAngular is made up of different packages that work together or standalone.
This repository holds a set of helpers that are aiming to provide:
- fully reactive applications
- fully or partially zone-less applications
- high-performance and non-blocking rendering
This is an example of how to use the *rxLet directive to bind an Observable value to the template. In this example, the component defines a property time$, which is an Observable that emits a value every second using the timer operator. The emitted values are mapped to the current time string using the map operator which is then displayed in the template using *rxLet.
import { RxLet } from '@rx-angular/template/let';
@Component({
selector: 'app-time',
standalone: true,
imports: [RxLet],
template: `
<ng-container *rxLet="time$; let value">
{{ value }}
</ng-container>
`,
})
export class TimeComponent {
time$ = timer(0, 1000).pipe(map(() => new Date().toTimeString()));
}To learn more about @rx-angular/template and its capabilities, check out the official documentation at https://rx-angular.io/docs/template.
In this example, we're creating a fully reactive counter component. We use rxState to manage the component's state, rxActions to define structured actions for state updates (specifically increment and decrement), and rxEffects to trigger side-effects when state changes occur. These mechanisms collectively enable efficient state management, action handling, and side-effect execution, resulting in a responsive and well-structured counter component.
import { rxState } from '@rx-angular/state';
import { rxEffects } from '@rx-angular/state/effects';
import { rxActions } from '@rx-angular/state/actions';
import { RxPush } from '@rx-angular/template/push';
@Component({
selector: 'app-counter',
standalone: true,
imports: [RxPush],
template: `
<p>Count: {{ count$ | push }}</p>
<button (click)="actions.increment()">Increment</button>
<button (click)="actions.decrement()">Decrement</button>
`,
})
export class CounterComponent {
readonly actions = rxActions<{
increment: void;
decrement: void;
}>();
private readonly state = rxState<{
count: number;
}>(({ set, connect }) => {
set({ count: 0 });
connect(this.actions.increment$, (state) => ({
count: state.count + 1,
}));
connect(this.actions.decrement$, (state) => ({
count: state.count - 1,
}));
});
readonly count$ = this.state.select('count');
constructor() {
rxEffects(({ register }) => {
register(this.count$, (count) => console.log(`Count changed: ${count}`));
});
}
}To learn more about @rx-angular/state and its capabilities, check out the official documentation at https://rx-angular.io/docs/state.
We welcome contributions from the community to help improve RxAngular! To get started, please take a look at our contribution guidelines in the CONTRIBUTING.md file. We appreciate your help in making RxAngular better for everyone.
This project is MIT licensed.
Made with ❤ by push-based.io

