Reference
shallow
function shallow<T>(objA: T, objB: T): boolean
A utility function that performs shallow equality comparison between two values. Useful as a comparison function for useStore to prevent unnecessary re-renders when selecting object slices.
The first value to compare.
The second value to compare.
Returns
true if the values are shallowly equal, false otherwise.
Comparison Behavior
The shallow function handles various data types:
- Reference equality: Returns
true if Object.is(objA, objB)
- Primitives/null: Returns
false if either value is not an object
- Map: Compares size and all entries using
Object.is
- Set: Compares size and all values for presence
- Date: Compares timestamps using
getTime()
- Objects: Compares own properties (including symbols) using
Object.is
Usage
With useStore
import { useStore, shallow } from '@tanstack/react-store'
import { store } from './store'
function TodoList() {
// Only re-render if the todos array properties change
const todos = useStore(
store,
(state) => state.todos,
shallow
)
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
)
}
Selecting Object Slices
import { useStore, shallow } from '@tanstack/react-store'
import { store } from './store'
function UserCard() {
// Shallow compare the selected object
const user = useStore(
store,
(state) => ({
name: state.user.name,
avatar: state.user.avatar,
status: state.user.status
}),
shallow
)
return (
<div>
<img src={user.avatar} alt={user.name} />
<h2>{user.name}</h2>
<span>{user.status}</span>
</div>
)
}
With Arrays
import { useStore, shallow } from '@tanstack/react-store'
import { store } from './store'
function FilteredList() {
// Re-render only if the filtered array reference or length changes
const items = useStore(
store,
(state) => state.items.filter(item => item.active),
shallow
)
return <div>Active items: {items.length}</div>
}
Notes
- Only compares own properties at the first level (shallow)
- For nested objects, only the reference is compared
- Handles special object types: Map, Set, Date
- Includes symbol properties in comparison
- More efficient than deep equality for most React use cases
- Use reference equality (default) if selecting primitive values or when you want strict reference checks