Junior
Чӣ тавр дуруст ҳолати компонентҳоро дар React тағир додан мумкин аст?
sobes.tech AI
Ҷавоб аз AI
Промяната на състоянието в React става чрез метода setState за класови компоненти или с помощта на hook-а useState за функционални компоненти.
Класови компоненти:
// Импортираме React
import React, { Component } from 'react';
// Създаваме класов компонент
class MyComponent extends Component {
// Инициализираме състоянието
constructor(props) {
super(props);
this.state = {
count: 0
};
}
// Метод за промяна на състоянието
incrementCount = () => {
// Използваме setState
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<div>
<p>Брояч: {this.state.count}</p>
<button onClick={this.incrementCount}>Увеличи</button>
</div>
);
}
}
// Експортираме компонента
export default MyComponent;
setStateе асинхронен.setStateобединява новото състояние с текущото (shallow merge).setStateможе да приема функция, която връща ново състояние, базирано на предишното:
// Метод за промяна на състоянието с използване на функция
incrementCountFunction = () => {
this.setState((prevState) => ({
count: prevState.count + 1
}));
};
Функционални компоненти (с използване на useState):
// Импортираме React и useState
import React, { useState } from 'react';
// Създаваме функционален компонент
function MyFunctionComponent() {
// Инициализираме състоянието с помощта на useState
const [count, setCount] = useState(0); // [текущо състояние, функция за обновяване]
// Функция за промяна на състоянието
const incrementCount = () => {
// Използваме функция за обновяване на състоянието
setCount(count + 1);
};
return (
<div>
<p>Брояч: {count}</p>
<button onClick={incrementCount}>Увеличи</button>
</div>
);
}
// Експортираме компонента
export default MyFunctionComponent;
useStateвръща масив от два елемента: текущо състояние и функция за неговото обновяване.- Функцията за обновяване на състоянието, която връща
useState, замества текущото състояние, а не го обединява. - Може да предавате функция към функцията за обновяване, ако новото състояние зависи от предишното:
// Функция за промяна на състоянието с използване на функция
const incrementCountFunction = () => {
setCount(prevCount => prevCount + 1);
};
Важни моменти при промяна на състоянието:
- Не променяйте състоянието директно: Никога не присвоявайте нова стойност на свойството
stateдиректно (напримерthis.state.count = 5илиcount = 5). React няма да забележи тази промяна и компонентът няма да се пререндерира. - Промени в обекти и масиви: При промяна на обекти или масиви в състоянието, винаги създавайте нови копия. React сравнява референциите към обектите/масивите, и ако референцията не се променя, React предполага, че данните не са се променили и не извиква пререндер.
// Промяна на обект в класов компонент
this.setState(prevState => ({
user: {
...prevState.user, // Копиране на старите свойства
name: 'Ново име' // Актуализиране на нужната собственост
}
}));
// Промяна на масив във функционален компонент
setItems(prevItems => [...prevItems, 'Нов елемент']); // Добавяне на нов елемент
- Асинхронност на
setState: Ако трябва да изпълните действие след като състоянието се обнови и компонентът се пререндерира, използвайте втория аргумент наsetState(функция-калбек) или hook-аuseEffectвъв функционалните компоненти.
// Калбек в setState
this.setState({ count: this.state.count + 1 }, () => {
console.log('Състоянието е обновено!');
});
// useEffect за реакция на промяна на състоянието
useEffect(() => {
console.log('Промени се състоянието count:', count);
}, [count]); // Зависимост: hook-ът ще се изпълни при промяна на count
Сравнение на методите:
| Характеристика | Класов компонент (setState) |
Функционален компонент (useState) |
|---|---|---|
| Синтаксис | Метод this.setState(newState[, callback]) |
Hook const [state, setState] = useState(initialState) |
| Обединяване/Замяна | Обединява новото състояние с текущото (shallow merge) | Заменя текущото състояние с ново |
| Асинхронност | Асинхронен | Функцията за обновяване е асинхронна при извикване от обработчици, но синхронна при извикване в рендер фазата на React |
| Зависимост от предишното състояние | Предаване на функция към setState: this.setState(prevState => ({...})) |
Предаване на функция към функцията за обновяване: setState(prev => ({...})) |