Reference
shallow
function shallow<T>(objA: T, objB: T): boolean
A utility function that performs shallow equality comparison between two values. Used as the default equality function in useStore to prevent unnecessary signal updates.
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 using
Object.is
Usage
Default Behavior
import { useStore } from '@tanstack/solid-store'
import { store } from './store'
// shallow is used by default
function Component() {
const user = useStore(store, (state) => state.user)
return <div>{user().name}</div>
}
Explicit Usage
import { useStore, shallow } from '@tanstack/solid-store'
import { store } from './store'
function UserCard() {
const user = useStore(
store,
(state) => ({
name: state.name,
email: state.email,
role: state.role
}),
{ equal: shallow }
)
return (
<div>
<h2>{user().name}</h2>
<p>{user().email}</p>
</div>
)
}
Reference Equality
import { useStore } from '@tanstack/solid-store'
import { store } from './store'
// Use strict reference equality for arrays
function TodoList() {
const todos = useStore(
store,
(state) => state.todos,
{ equal: (a, b) => a === b }
)
return (
<ul>
<For each={todos()}>
{(todo) => <li>{todo.text}</li>}
</For>
</ul>
)
}
Array Operations
import { For } from 'solid-js'
import { useStore, shallow } from '@tanstack/solid-store'
import { store } from './store'
function FilteredList() {
// Shallow comparison on filtered results
const activeItems = useStore(
store,
(state) => state.items.filter(item => item.active),
{ equal: shallow }
)
return (
<ul>
<For each={activeItems()}>
{(item) => <li>{item.name}</li>}
</For>
</ul>
)
}
Object Slices
import { useStore, shallow } from '@tanstack/solid-store'
import { store } from './store'
function Settings() {
const settings = useStore(
store,
(state) => ({
theme: state.settings.theme,
language: state.settings.language,
notifications: state.settings.notifications
}),
{ equal: shallow }
)
return (
<div>
<p>Theme: {settings().theme}</p>
<p>Language: {settings().language}</p>
</div>
)
}
With createMemo
import { createMemo } from 'solid-js'
import { useStore, shallow } from '@tanstack/solid-store'
import { store } from './store'
function Dashboard() {
const stats = useStore(
store,
(state) => ({
users: state.users.length,
posts: state.posts.length
}),
{ equal: shallow }
)
const total = createMemo(() => stats().users + stats().posts)
return <div>Total items: {total()}</div>
}
Notes
- Used as the default equality function in
useStore
- Only compares own properties at the first level (shallow)
- For nested objects, only the reference is compared
- Handles special object types: Map, Set, Date
- Optimized for Solid’s fine-grained reactivity system
- Prevents unnecessary signal updates when object contents are equivalent
- More efficient than deep equality for most reactive scenarios