State-এ একটি সংখ্যা বা স্ট্রিং আপডেট করা সহজ — setCount(count + 1)। অবজেক্ট আর অ্যারের জন্য আরও একটি নিয়ম দরকার: React state কখনো সরাসরি mutate করা উচিত নয়।
React আংশিকভাবে re-render করবে কিনা তা চেক করে state মান আগের চেয়ে একটি ভিন্ন অবজেক্ট কিনা দেখে। বিদ্যমান অবজেক্ট in place mutate করলে এটি একই অবজেক্ট রেফারেন্স থেকে যায় — React কিছু বদলেছে বলতে পারে না, আর চুপচাপ re-render বাদ দিয়ে দেয়:
function Profile() {
const [user, setUser] = useState({ name: 'Priya', age: 21 });
function haveBirthday() {
user.age = user.age + 1; // mutates the existing object — DOES NOT re-render
setUser(user); // same reference as before, React sees no change
}
return <button onClick={haveBirthday}>{user.name} is {user.age}</button>;
}JavaScript ES6 পাঠ-এর spread অপারেটর ব্যবহার করে পরিবর্তনসহ একটি নতুন অবজেক্ট (বা অ্যারে) তৈরি করুন, আর সেই নতুন অবজেক্ট setter-এ পাস করুন:
function haveBirthday() {
setUser({ ...user, age: user.age + 1 }); // a new object, one field changed
}{ ...user, age: user.age + 1 } user-এর প্রতিটি ফিল্ড একটি সম্পূর্ণ নতুন অবজেক্টে কপি করে, তারপর age ওভাররাইট করে — একটি সত্যিকারের নতুন রেফারেন্স যা React পুরনোটার সাথে তুলনা করতে পারে।
| কাজ | করবেন না | করুন |
|---|---|---|
| একটি আইটেম যোগ করা | items.push(newItem) | setItems([...items, newItem]) |
| একটি আইটেম সরানো | items.splice(i, 1) | setItems(items.filter((_, idx) => idx !== i)) |
| একটি আইটেম আপডেট করা | items[i].done = true | setItems(items.map((item, idx) => idx === i ? { ...item, done: true } : item)) |
function TodoList() {
const [todos, setTodos] = useState([
{ id: 1, text: 'Learn React', done: false },
]);
function toggleTodo(id) {
setTodos(todos.map((todo) =>
todo.id === id ? { ...todo, done: !todo.done } : todo
));
}
return (
<ul>
{todos.map((todo) => (
<li key={todo.id} onClick={() => toggleTodo(todo.id)}>
{todo.done ? '✓' : '○'} {todo.text}
</li>
))}
</ul>
);
}Non-mutating বনাম mutating অ্যারে মেথড
অ্যারে মেথড পরিষ্কারভাবে দুই ভাগে ভাগ হয়: map(), filter(), আর spread অপারেটর ([...arr]) সবগুলো একটি নতুন অ্যারে রিটার্ন করে, state-এর জন্য নিরাপদ। push(), splice(), sort(), আর সরাসরি index assignment (arr[0] = x) সবগুলো বিদ্যমান অ্যারে mutate করে — state-এ এগুলো সরাসরি কখনো ব্যবহার করবেন না।