Computed

Computed values allow you to derive state from your application state. They calculate and cache derived values based on dependencies from the state tree.

API Reference 

Creating Computed 

import { state } from 'cerebral'

// Basic computed function
export const fullName = (get) => {
  const firstName = get(state`user.firstName`)
  const lastName = get(state`user.lastName`)

  return `${firstName} ${lastName}`
}

// With conditional logic
export const userStatus = (get) => {
  const isLoggedIn = get(state`user.isLoggedIn`)

  if (isLoggedIn) {
    const lastActive = get(state`user.lastActive`)
    return lastActive > Date.now() - 3600000 ? 'active' : 'away'
  }

  return 'offline'
}

The computed function receives a get parameter which is used to retrieve values from the state tree. Using get automatically creates dependency tracking.

Using in State Tree 

Computed values are added directly to your state tree:

import { fullName, userStatus } from './computed'

export default {
  state: {
    user: {
      firstName: 'John',
      lastName: 'Doe',
      isLoggedIn: true,
      lastActive: Date.now()
    },
    fullName, // <-- Computed added to state
    userStatus // <-- Another computed
  }
}

Accessing Computed Values 

You can access computed values just like regular state:

// In an action
function myAction({ get }) {
  const name = get(state`fullName`)
  // Do something with name
}

// In a component (React example)
connect(
  {
    name: state`fullName`,
    status: state`userStatus`
  },
  function User({ name, status }) {
    return (
      <div>
        <h1>{name}</h1>
        <span>Status: {status}</span>
      </div>
    )
  }
)

Using Props 

Computed values can access props when used in components:

import { state, props } from 'cerebral'

export const itemDetails = (get) => {
  const itemId = get(props`itemId`)
  const item = get(state`items.${itemId}`)

  return item || { name: 'Unknown item' }
}

When used in a component:

// React component
connect(
  {
    item: state`itemDetails`
  },
  function ItemDetails({ item }) {
    return <div>{item.name}</div>
  }
)

// Usage
<ItemDetails itemId="123" />

When used in an action, props must be passed explicitly:

function myAction({ get }) {
  const item = get(state`itemDetails`, { itemId: '123' })
}

The get Function 

The get function has these capabilities:

  1. Retrieve state values:

    const user = get(state`user`)
  2. Access paths:

    const path = get.path(state`user.settings`)
    // Returns 'user.settings'
  3. Access other computed values:

    const name = get(state`fullName`)

Behavior 

  • Caching: Computed values are cached and only recalculate when their dependencies change - Composition: Computed values can use other computed values - Cloning: When a computed uses props and is connected to a component, it’s cloned for that instance - Optimization: The dependency tracking ensures minimal recalculations

For more examples and advanced usage patterns, see the advanced computed documentation.