Реакт-редукс должен иметь побочные эффекты? - PullRequest
0 голосов
/ 21 октября 2018

У меня есть компонент, для которого нужны данные пользователя, вошедшего в систему, но в этом компоненте я не уверен, вошел ли пользователь в систему или нет, является ли плохой практикой проверять данные о существовании в mapStateToProps и перенаправлять на страницу входа в систему, если это необходимо?это побочный эффект?как насчет получения данных, которые еще не существуют в состоянии?как мне справиться с такими проблемами?

что мы должны делать в mapState и что мы не должны делать?есть ли хорошая практика для этого?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Итак, давайте предположим, что вы определили свои маршруты в компоненте src/components/App.js.Вы находитесь в точке, когда вам нужно убедиться, что ваш App компонент знает, действительно ли пользователь вообще вошел в систему.

Давайте также предположим, что вы уже разработали редуктор в reducers/auth.js длязапишите, вошел ли пользователь в систему или нет, и вы присвоили authReducer вашему auth элементу состояния.

На данный момент, внутри вашего файла src/components/App.js вам потребуется импортировать:

import { connect } from 'react-redux';

Затем в нижней части вашего App компонента вам нужно определить свой mapStateToProps следующим образом:

function mapStateToProps(state) {
  return { auth: state.auth }
}

export default App;

Итак, что я рекомендую выше, так эточто вы передаете state в mapStateToProps, а затем return объект с ключом auth, который будет принимать любое значение, выходящее из authReducer.

Затем вы берете connect() функция, которую вы импортировали, и передайте ей mapStateToProps следующим образом:

export default connect(mapStateToProps)(App);

Так что теперь ваш App компонент знает, вошел ли пользователь в систему или нет.

Так в чем же преимущество реализации вышеуказанного?Ну, это дает вам гибкость в определении того, что отображать в вашем представлении, в зависимости от того, вошел ли пользователь в систему или нет.Например, кнопка входа / выхода.

Теперь вы можете разработать эту кнопку с помощью вспомогательного метода с условным условием, подобным следующему:

renderButton() {
  if (this.props.auth) {
   return (
     <button>
       Sign Out
     </button>
   );
  } else {
   return (
     <button>
       Sign In
     </button>
   );
  }
}
0 голосов
/ 21 октября 2018

это плохая практика, чтобы проверять данные о существовании в mapStateToProps и перенаправлять на страницу входа в систему, если это необходимо?

Я не уверен, является ли это лучшей практикой или нет, но если мы посмотримв семантике mapStateToProps его основное использование - сопоставление избыточного состояния с компонентами.

Таким образом, в этом смысле все, что не является отображением, может рассматриваться как побочный эффект.

Если вы хотите выровнять с помощью redux-way, тогда вы передаете mapStateToProps свойств, на которые хотите реагировать, и изменяете эти свойства с помощью mapDispatchToProps.

Так что в вашем случае выбудет иметь какой-то сервис Authentication, который будет иметь такие методы, как login, logout, register, который будет отправлять действия на ваш пристав store, а в mapStateToProps вы будете подписываться на что-то вроде isAuthenticated.

И в вашем рендере вы бы проверили, если this.props.isAuthenticated ? <PrintSome> : null

Вы также можете проверить этот урок с в основном той же идеей, но вынести его в компонент более высокого порядка для повторного использования https://medium.com/quick-code/adding-authentication-to-react-redux-firebase-app-f0efcb1c519a

...