Skills included: - pr-reviewer: Adapted for Gitea/GitHub via platform-aware scripts (dropped fetch_pr_data.py and add_inline_comment.py, kept generate_review_files.py) - code-review-excellence: Methodology and checklists (React, TS, Python, etc.) - vercel-react-best-practices: 57 rules for React/Next.js performance - tailwind-design-system: Tailwind CSS v4 patterns, CVA, design tokens New shell scripts added to ~/.claude/scripts/git/: - pr-diff.sh: Get PR diff (GitHub gh / Gitea API) - pr-metadata.sh: Get PR metadata as normalized JSON Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
39 lines
1.1 KiB
Markdown
39 lines
1.1 KiB
Markdown
---
|
|
|
|
title: Extract Default Non-primitive Parameter Value from Memoized Component to Constant
|
|
impact: MEDIUM
|
|
impactDescription: restores memoization by using a constant for default value
|
|
tags: rerender, memo, optimization
|
|
|
|
---
|
|
|
|
## Extract Default Non-primitive Parameter Value from Memoized Component to Constant
|
|
|
|
When memoized component has a default value for some non-primitive optional parameter, such as an array, function, or object, calling the component without that parameter results in broken memoization. This is because new value instances are created on every rerender, and they do not pass strict equality comparison in `memo()`.
|
|
|
|
To address this issue, extract the default value into a constant.
|
|
|
|
**Incorrect (`onClick` has different values on every rerender):**
|
|
|
|
```tsx
|
|
const UserAvatar = memo(function UserAvatar({ onClick = () => {} }: { onClick?: () => void }) {
|
|
// ...
|
|
})
|
|
|
|
// Used without optional onClick
|
|
<UserAvatar />
|
|
```
|
|
|
|
**Correct (stable default value):**
|
|
|
|
```tsx
|
|
const NOOP = () => {};
|
|
|
|
const UserAvatar = memo(function UserAvatar({ onClick = NOOP }: { onClick?: () => void }) {
|
|
// ...
|
|
})
|
|
|
|
// Used without optional onClick
|
|
<UserAvatar />
|
|
```
|