Позвольте мне попытаться ответить один на один на ваши вопросы.
Правильно ли я придерживаюсь учебника redux
?
Да, вы на правильном путиВсего несколько шагов. Приведенное ниже объяснение относится к компонентам на основе классов.
Технически, если вы создали действия - как и выше в своем вопросе - тогда вам нужно отправить их в компонент для использования.
- Сначала необходимо отправить действия в
mapDispatchToProps
. - Затем необходимо подключить компонент - для вызова действия
requestSignIn
- с хранилищем Redux
. - Передатьсоздал
mapDispatchToProps
для подключения в качестве второго параметра.
Ниже приведен следующий пример:
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
// ... other imports
class YourComponent extends React.Component {
constructor (props) {
super(props);
}
// ... component code
// ... obviously this is just an example component for representation
render() {
return (
<>
<a onClick={props.requestSignIn()}>Request Sign In</a>
</>
)
}
}
const mapDispatchToProps = dispatch => {
return bindActionCreators({ requestSignIn }, dispatch);
};
export default connect(null, mapDispatchToProps)(YourComponent);
Если я хочу, чтобы приложение имело флаг isLoading
в состояние, какое действие должно изменить флаг?
Я бы создал в редукторе новое свойство с именем isLoading
, как показано ниже:
const initialState = {
isLoading: false,
};
export default (state=initialState, action) => {
switch(action.type) {
case 'ENABLE_LOADING':
return {
...state,
isLoading: true,
};
case 'REQUEST_SIGN_IN_SUCCESS':
return {
...state,
isLoading: false,
};
case 'REQUEST_SIGN_IN_FAILURE':
return {
...state,
isLoading: false,
};
// ... other actions
}
}
В вашем requestSignIn
действие должно вызвать ENABLE_LOADING
, как только вы начнете извлекать данные за одну строку до firebase.auth().signInWithEmailAndPassword(EMAIL, PASSWORD)
, тогда, надеюсь, это сработает для вас. Как и в случае с REQUEST_SIGN_IN_SUCCESS
и REQUEST_SIGN_IN_FAILURE
.
Чтобы получить доступ к свойствам редуктора, вам нужно использовать mapStateToProps
далее.
В случае функциональных компонентов вам нужно использовать useDispatch
для вызова созданных действий:
Этот хук возвращает ссылку на функцию отправки из хранилища Redux. Вы можете использовать его для отправки необходимых действий.
А для доступа к данным из хранилища есть хук, называемый useSelector
:
Позволяет извлекать данныеиз состояния хранилища Redux, используя функцию селектора.
Краткий обзор:
Если вы ищете полностью рабочий пример с useSelector
и useDispatch
в функциональном компоненте, затем взгляните на этот репозиторий git:
https://github.com/norbitrial/react-redux-loading-data-example
В репозитории вы найдете хорошее представление о ложном вызове API, который загружает данные в таблицус индикатором загрузчика, точно так же, как вам нужно из вашего вопроса.
В случае дополнительной заинтересованности в более подробной информации, пожалуйста, найдите ссылки, которые довольно полезны:
- Connect: диспетчеризация действий с mapDispatchToProps
- Connect: извлечение данных с mapStateToProps
- диспетчеризация действий с
useDispatch()
для функционального компонента - Extrобработайте данные с помощью
useSelector()
для функционального компонента
Надеюсь, это поможет, дайте мне знать, если вам нужны дополнительные разъяснения.