What is @vue/reactivity?
The @vue/reactivity package is part of the Vue.js framework, designed to provide a standalone reactivity system that can be used outside of Vue components. It allows developers to create reactive objects and track changes to them, enabling the development of responsive applications. The package includes features such as reactive state, computed values, and watchers.
What are @vue/reactivity's main functionalities?
Creating reactive objects
This feature allows you to create a reactive object. Any changes to the object's properties will be tracked, making it useful for building responsive interfaces.
import { reactive } from '@vue/reactivity';
const state = reactive({ count: 0 });
Creating computed properties
Computed properties automatically calculate their value based on reactive state. They are recalculated only when their dependencies change, making them efficient.
import { computed } from '@vue/reactivity';
const count = reactive({ num: 1 });
const plusOne = computed(() => count.num + 1);
Watching for changes
The watch function allows you to execute a callback function whenever a specified reactive property changes, enabling you to respond to changes in the state.
import { watch } from '@vue/reactivity';
const state = reactive({ count: 0 });
watch(() => state.count, (newVal, oldVal) => {
console.log(`Count changed from ${oldVal} to ${newVal}`);
});
Other packages similar to @vue/reactivity
mobx
MobX is a state management library that also provides reactivity. It uses observables and actions to manage state changes. Compared to @vue/reactivity, MobX can be used with any framework and offers a more opinionated approach to state management.
immer
Immer is designed to work with immutable state, making it easier to update complex state without mutating the original state. Unlike @vue/reactivity, which tracks changes to mutable objects, Immer uses a copy-on-write mechanism.
rxjs
RxJS is a library for reactive programming using Observables. It allows you to compose asynchronous and event-based programs. While @vue/reactivity focuses on reactive state for UIs, RxJS provides a broader set of tools for handling asynchronous data streams.
@vue/reactivity
Usage Note
This package is inlined into Global & Browser ESM builds of user-facing renderers (e.g. @vue/runtime-dom
), but also published as a package that can be used standalone. The standalone build should not be used alongside a pre-bundled build of a user-facing renderer, as they will have different internal storage for reactivity connections. A user-facing renderer should re-export all APIs from this package.
For full exposed APIs, see src/index.ts
. You can also run pnpm build reactivity --types
from repo root, which will generate an API report at temp/reactivity.api.md
.
Credits
The implementation of this module is inspired by the following prior art in the JavaScript ecosystem:
Caveats
- Built-in objects are not observed except for
Array
, Map
, WeakMap
, Set
and WeakSet
.