Оригинальный адрес:medium.com/better-pro Страна…
Адрес перевода:GitHub.com/small-T/note…
Авторские права на эту статью принадлежат оригинальному автору, а перевод предназначен только для ознакомления.
Нужны ли нам по-прежнему фреймворки для управления состоянием, такие как Redux и Mobx?
введение
Внедрение хуков React, несомненно, изменило статус-кво управления состоянием.
До этого было сложно разделить логику, связанную с состоянием, между компонентами. Теперь мы можем справиться с этим, просто абстрагировав хук (например:useUserLogin
).
Возникает вопрос, зачем нам все еще нужна структура управления состоянием? В этом посте я представлю свой процесс принятия решений: Как управлятьstate
. Я также поделюсь своим мнением о том, нужен ли нам еще фреймворк управления состоянием в 2020 году.
Что изменилось?
Как мы определяли состояние до хуков? По сути, есть два варианта: определить локальное состояние внутри компонента или установить глобальное состояние с помощью структуры управления состоянием (например, Mobx/Redux).
локальное состояние (до хуков)
export class UserList extends Component {
state = {
isLoading: false,
hasError: false,
users: []
}
searchUsers(value) {
this.setState({isLoading: true});
api.get(`/users?searchKey=${value}`)
.then((data) => this.setState({users: data}))
.catch(() => this.setState({hasError: true}))
.finally(() => this.setState({loading: false}));
}
render() {
if (this.state.isLoading) {
// render loading spinner
}
if (this.state.hasError) {
// render error message
}
return (
<div>
<input onChange={(event) => this.searchUsers(event.target.value)} />
</div>
)
}
}
Далее мы объясним проблемы, возникающие при наличии только этих двух вариантов. Однако, предполагая, что наше состояние не обязательно должно быть глобальным, мы хотим повторно использовать состояние в нескольких компонентах, как мы определяем локальное состояние.
В приведенной выше демонстрации мы могли бы захотеть повторно использовать состояния загрузки и ошибки, что было невозможно до использования хуков. Единственный вариант — повторно использовать его с Redux. В Redux любой компонент, которому нужно искать пользователей, просто отправляет действие (searchUsers()
) и прослушивать изменения в глобальном состоянии.
Однако использование этих глобальных состояний (Redux/Mobx) приводит к некоторым проблемам:
- больше шаблонного кода
- сложный поток данных
- Несколько компонентов поддерживают глобальное состояние, что может привести к неожиданным побочным эффектам.
Решение: React Hooks!
К счастью, хуки были представлены в React v16.8. С этого момента становится возможным совместное использование логики, связанной с состоянием, между компонентами.
В приведенной ниже демонстрации мы можем поделиться поведением при загрузке и ошибке:
import {useState} from 'react';
const useRequestHandler = () => {
const [isLoading, setLoading] = useState(false);
const [hasError, setError] = useState(false);
const [data, setData] = useState(null);
const handleRequest = (request) => {
setLoading(true);
setError(false);
return api.get(request)
.then(setData)
.catch(() => setError(true))
.finally(() => setLoading(false))
};
return {isLoading, hasError, data, handleRequest};
};
const UserList = () => {
const {data, isLoading, hasError, handleRequest} = useRequestHandler();
const searchUsers = (value) => handleRequest(`/users?searchKey=${value}`);
return (
<React.Fragment>
{data.map(u => <p>{u.name}</p>)}
</React.Fragment>
)
}
больше преимуществ: Если несколько компонентов нуждаются в функции поиска в списке пользователей, мы также можем настроитьuseUserSearch
крюк.
Тем не менее, крючки не панацея. Сохранение состояния в хуке не означает, что он становится одноэлементным объектом, он просто привязывается к компоненту. В некоторых случаях мы хотим сохранить только объект состояния экземпляра (например, загрузить информацию о пользователе только один раз). Это функциональность, предоставляемая структурой управления состоянием.
как, когда и где управлять состоянием
Теперь, когда логика, связанная с состоянием, может быть разделена между несколькими компонентами, как решить, хранится ли состояние в компоненте (локально) или в структуре управления состоянием (глобально)?
На изображении ниже показан мой процесс принятия решений.
Каковы преимущества структуры государственного управления?
Теперь мы знаем, как выбирать между глобальным и локальным. Но зачем нужна структура управления государством в 2020 году? Как это соотносится с React Hooks?
Есть несколько преимуществ:
- Глобальное определение также означает, что существует только один экземпляр объекта
- будет загружать удаленные данные только один раз
- Поддержка инструментов разработки
- Предоставляет стандартный способ разработки для разработчиков программного обеспечения
Суммировать
Мы видим, как React Hooks встряхивают ландшафт управления состоянием. Благодаря их внедрению стало проще обмениваться логикой, связанной с состоянием, между компонентами.
Однако хуки — это не серебряная пуля, нам все еще нужна структура управления состоянием. Это не означает, что все состояния должны быть глобальными — в большинстве случаев лучше хранить их между компонентами. только вкогда это абсолютно необходимо, перед перемещением состояния в структуру управления состоянием.