logo by @sawaratsuki1004
React
v19.2
تعلم
مرجع
المجتمع
المدونة

هل هذه الصفحة مفيدة؟

في هذه الصفحة

  • Overview
  • Rule Details
  • Common Violations
  • Invalid
  • Valid
  • Troubleshooting
  • I need to add items to an array
  • I need to update nested objects

    react@19.2

  • نظرة عامة
  • Hooks
    • useActionState
    • useCallback
    • useContext
    • useDebugValue
    • useDeferredValue
    • useEffect
    • useEffectEvent
    • useId
    • useImperativeHandle
    • useInsertionEffect
    • useLayoutEffect
    • useMemo
    • useOptimistic
    • useReducer
    • useRef
    • useState
    • useSyncExternalStore
    • useTransition
  • المكونات
    • <Fragment> (<>)
    • <Profiler>
    • <StrictMode>
    • <Suspense>
    • <Activity>
    • <ViewTransition> - هذه الميزة متاحة في أحدث إصدار Canary من React
  • APIs
    • act
    • addTransitionType - هذه الميزة متاحة في أحدث إصدار Canary من React
    • cache
    • cacheSignal
    • captureOwnerStack
    • createContext
    • lazy
    • memo
    • startTransition
    • use
    • experimental_taintObjectReference - هذه الميزة متاحة في أحدث إصدار تجريبي من React
    • experimental_taintUniqueValue - هذه الميزة متاحة في أحدث إصدار تجريبي من React
  • react-dom@19.2

  • Hooks
    • useFormStatus
  • المكونات (Components)
    • Common (e.g. <div>)
    • <form>
    • <input>
    • <option>
    • <progress>
    • <select>
    • <textarea>
    • <link>
    • <meta>
    • <script>
    • <style>
    • <title>
  • APIs
    • createPortal
    • flushSync
    • preconnect
    • prefetchDNS
    • preinit
    • preinitModule
    • preload
    • preloadModule
  • Client APIs
    • createRoot
    • hydrateRoot
  • Server APIs
    • renderToPipeableStream
    • renderToReadableStream
    • renderToStaticMarkup
    • renderToString
    • resume
    • resumeToPipeableStream
  • Static APIs
    • prerender
    • prerenderToNodeStream
    • resumeAndPrerender
    • resumeAndPrerenderToNodeStream
  • React Compiler

  • الإعدادات (Configuration)
    • compilationMode
    • gating
    • logger
    • panicThreshold
    • target
  • Directives
    • "use memo"
    • "use no memo"
  • تصريف المكتبات (Compiling Libraries)
  • React DevTools

  • React Performance tracks
  • eslint-plugin-react-hooks

  • Lints
    • exhaustive-deps
    • rules-of-hooks
    • component-hook-factories
    • config
    • error-boundaries
    • gating
    • globals
    • immutability
    • incompatible-library
    • preserve-manual-memoization
    • purity
    • refs
    • set-state-in-effect
    • set-state-in-render
    • static-components
    • unsupported-syntax
    • use-memo
  • قواعد React (Rules of React)

  • نظرة عامة (Overview)
    • Components و Hooks يجب أن تكون Pure
    • React تستدعي Components و Hooks
    • قواعد Hooks
  • React Server Components

  • Server Components
  • Server Functions
  • Directives
    • 'use client'
    • 'use server'
  • Legacy APIs

  • Legacy React APIs
    • Children
    • cloneElement
    • Component
    • createElement
    • createRef
    • forwardRef
    • isValidElement
    • PureComponent
مرجع API
Lints

immutability

Validates against mutating props, state, and other values that are immutable.

Rule Details

A component’s props and state are immutable snapshots. Never mutate them directly. Instead, pass new props down, and use the setter function from useState.

Common Violations

Invalid

// ❌ Array push mutation function Component() { const [items, setItems] = useState([1, 2, 3]); const addItem = () => { items.push(4); // Mutating! setItems(items); // Same reference, no re-render }; } // ❌ Object property assignment function Component() { const [user, setUser] = useState({name: 'Alice'}); const updateName = () => { user.name = 'Bob'; // Mutating! setUser(user); // Same reference }; } // ❌ Sort without spreading function Component() { const [items, setItems] = useState([3, 1, 2]); const sortItems = () => { setItems(items.sort()); // sort mutates! }; }

Valid

// ✅ Create new array function Component() { const [items, setItems] = useState([1, 2, 3]); const addItem = () => { setItems([...items, 4]); // New array }; } // ✅ Create new object function Component() { const [user, setUser] = useState({name: 'Alice'}); const updateName = () => { setUser({...user, name: 'Bob'}); // New object }; }

Troubleshooting

I need to add items to an array

Mutating arrays with methods like push() won’t trigger re-renders:

// ❌ Wrong: Mutating the array function TodoList() { const [todos, setTodos] = useState([]); const addTodo = (id, text) => { todos.push({id, text}); setTodos(todos); // Same array reference! }; return ( <ul> {todos.map(todo => <li key={todo.id}>{todo.text}</li>)} </ul> ); }

Create a new array instead:

// ✅ Better: Create a new array function TodoList() { const [todos, setTodos] = useState([]); const addTodo = (id, text) => { setTodos([...todos, {id, text}]); // Or: setTodos(todos => [...todos, {id: Date.now(), text}]) }; return ( <ul> {todos.map(todo => <li key={todo.id}>{todo.text}</li>)} </ul> ); }

I need to update nested objects

Mutating nested properties doesn’t trigger re-renders:

// ❌ Wrong: Mutating nested object function UserProfile() { const [user, setUser] = useState({ name: 'Alice', settings: { theme: 'light', notifications: true } }); const toggleTheme = () => { user.settings.theme = 'dark'; // Mutation! setUser(user); // Same object reference }; }

Spread at each level that needs updating:

// ✅ Better: Create new objects at each level function UserProfile() { const [user, setUser] = useState({ name: 'Alice', settings: { theme: 'light', notifications: true } }); const toggleTheme = () => { setUser({ ...user, settings: { ...user.settings, theme: 'dark' } }); }; }

السابقglobals
التاليincompatible-library

Copyright © Meta Platforms, Inc
no uwu plz
uwu?
Logo by@sawaratsuki1004
تعلم React
بداية سريعة
التثبيت
وصف واجهة المستخدم (UI)
إضافة التفاعلية
إدارة State
مخارج الطوارئ
مرجع API
React APIs
React DOM APIs
المجتمع
ميثاق السلوك
تعرف على الفريق
المساهمون في التوثيق
شكر وتقدير
المزيد
المدونة
React Native
الخصوصية
الشروط
// ❌ Array push mutation
function Component() {
const [items, setItems] = useState([1, 2, 3]);

const addItem = () => {
items.push(4); // Mutating!
setItems(items); // Same reference, no re-render
};
}

// ❌ Object property assignment
function Component() {
const [user, setUser] = useState({name: 'Alice'});

const updateName = () => {
user.name = 'Bob'; // Mutating!
setUser(user); // Same reference
};
}

// ❌ Sort without spreading
function Component() {
const [items, setItems] = useState([3, 1, 2]);

const sortItems = () => {
setItems(items.sort()); // sort mutates!
};
}
// ✅ Create new array
function Component() {
const [items, setItems] = useState([1, 2, 3]);

const addItem = () => {
setItems([...items, 4]); // New array
};
}

// ✅ Create new object
function Component() {
const [user, setUser] = useState({name: 'Alice'});

const updateName = () => {
setUser({...user, name: 'Bob'}); // New object
};
}
// ❌ Wrong: Mutating the array
function TodoList() {
const [todos, setTodos] = useState([]);

const addTodo = (id, text) => {
todos.push({id, text});
setTodos(todos); // Same array reference!
};

return (
<ul>
{todos.map(todo => <li key={todo.id}>{todo.text}</li>)}
</ul>
);
}
// ✅ Better: Create a new array
function TodoList() {
const [todos, setTodos] = useState([]);

const addTodo = (id, text) => {
setTodos([...todos, {id, text}]);
// Or: setTodos(todos => [...todos, {id: Date.now(), text}])
};

return (
<ul>
{todos.map(todo => <li key={todo.id}>{todo.text}</li>)}
</ul>
);
}
// ❌ Wrong: Mutating nested object
function UserProfile() {
const [user, setUser] = useState({
name: 'Alice',
settings: {
theme: 'light',
notifications: true
}
});

const toggleTheme = () => {
user.settings.theme = 'dark'; // Mutation!
setUser(user); // Same object reference
};
}
// ✅ Better: Create new objects at each level
function UserProfile() {
const [user, setUser] = useState({
name: 'Alice',
settings: {
theme: 'light',
notifications: true
}
});

const toggleTheme = () => {
setUser({
...user,
settings: {
...user.settings,
theme: 'dark'
}
});
};
}