Skip to content
Development
Agent

rendering-patterns

<!-- Loaded by react-native-engineer when task involves conditional rendering, &&, Text components, React Compiler, memoization -->

From plugin
vexjoy-agent
449198 skills198 agents12 commands83 hooks

Claude Code

$ npx -y skills add notque/vexjoy-agent --agent claude-code

Agent definition

rendering-patterns.md

Rendering Patterns Reference

<!-- Loaded by react-native-engineer when task involves conditional rendering, &&, Text components, React Compiler, memoization -->

Use Ternary or Explicit Boolean for Conditional Rendering

**Impact:** CRITICAL — prevents hard crash in production

`{value && <Component />}` crashes React Native when `value` is `0` or empty string. These are falsy but JSX-renderable — RN tries to render them as text outside `<Text>`, causing a hard crash. React Native-specific (not a web issue).

**Instead of:**

{name && <Text>{name}</Text>}   // crashes if name is ""
{count && <Text>{count} items</Text>}  // crashes if count is 0

**Use:**

{name ? <Text>{name}</Text> : null}
{count > 0 ? <Text>{count} items</Text> : null}
// Or: {!!name && <Text>{name}</Text>}
// Or: early return — if (!name) return null

Enable `react/jsx-no-leaked-render` ESLint rule.

---

Wrap All Strings in Text Components

**Impact:** CRITICAL — prevents runtime crash

Strings must be inside `<Text>`. React Native throws a hard error on string children of `<View>`.

**Instead of:**

return <View>Hello, {name}!</View>

**Use:**

return <View><Text>Hello, {name}!</Text></View>

Applies to string literals, template literals, and expressions that evaluate to strings.

---

Destructure Functions Early in Render (React Compiler)

**Impact:** HIGH — stable references, fewer re-renders

With React Compiler, destructure functions from hooks and props at render scope top. The compiler keys cache on read variables — dotting into objects uses the object reference (changes each render).

**Instead of:**

function SaveButton(props) {
  const router = useRouter()
  const handlePress = () => { props.onSave(); router.push('/success') }
  return <Button onPress={handlePress}>Save</Button>
}

**Use:**

function SaveButton({ onSave }) {
  const { push } = useRouter()
  const handlePress = () => { onSave(); push('/success') }
  return <Button onPress={handlePress}>Save</Button>
}

Only applies with React Compiler enabled. Without it, use standard `useCallback`.

---

Memoization Patterns Without React Compiler

const UserRow = memo(function UserRow({ name, isActive }: Props) {
  return <View>{/* ... */}</View>
})

const handlePress = useCallback((id: string) => {
  dispatch({ type: 'SELECT', id })
}, [dispatch])

const sorted = useMemo(
  () => items.toSorted((a, b) => a.name.localeCompare(b.name)),
  [items]
)

With React Compiler, `memo()` and `useCallback()` are handled automatically. Object reference stability still matters for virtualized lists.

---

Hoist Intl Formatters to Module Scope

**Impact:** LOW-MEDIUM — avoids expensive instantiation per render

**Instead of:**

function Price({ amount }: { amount: number }) {
  const formatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' })
  return <Text>{formatter.format(amount)}</Text>
}

**Use:**

const currencyFormatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' })

function Price({ amount }: { amount: number }) {
  return <Text>{currencyFormatter.format(amount)}</Text>
}

For dynamic locales, memoize: `useMemo(() => new Intl.DateTimeFormat(locale, opts), [locale])`.

Read more
@notque
Ships withvexjoy-agent

Essays and writing behind this toolkit live at vexjoy.com. VexJoy Agent connects plain-English requests to specialist agents, skills, and workflows. /do selects the knowledge and tools needed for your task.

44964 skills198 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
449
Star history of notque/vexjoy-agent on GitHub, a chart by star-history.com

Other agents on vexjoy-agent.

modules

modules

Agent

**Scope**: Module selection patterns, builtin vs command/shell decisions, collection modules, and version-specific module changes…

@notque@notqueInstall Agent
testing

testing

Agent

**Scope**: Molecule test scenarios, ansible-lint rules, idempotency validation, and check-mode patterns **Version range**:…

@notque@notqueInstall Agent
communication-patterns

communication-patterns

Agent

**Scope**: Failure modes in agent output style — over-reporting, self-congratulation, verbose narration, and hedging. Covers what…

@notque@notqueInstall Agent

More agents from other plugins.

a11y-architect
Auto-invoked

a11y-architect

Agent

Accessibility Architect specializing in WCAG 2.2 compliance for Web and Native platforms. Use PROACTIVELY when designing UI…

ecc13d293k
@affaan-m@affaan-mInstall Agent
analyze-pass-impact

analyze-pass-impact

Agent

Analyzes how a specific topic affects a group of compiler passes. Used by the /plan-update skill to parallelize research across…

react2d252k
@facebook@facebookInstall Agent
orchestrator

orchestrator

Agent

- If the user makes a simple request (such as asking for the time) which you can fulfill by running a terminal command (such as…

codex2d135k
@openai@openaiInstall Agent
cavecrew-builder

cavecrew-builder

Agent

Surgical 1-2 file edit. Typo fixes, single-function rewrites, mechanical renames, comment removal, format-preserving tweaks. Hard…

caveman3d119k
@juliusbrussee@juliusbrusseeInstall Agent

Questions about rendering-patterns.

Which coding agents can use rendering-patterns?
rendering-patterns installs in Claude Code and Cursor: each loads subagents from .claude/agents, so copy the file there. Flowy's auto-invocation runs in Claude Code only.