【问题标题】:Redux Store (returns only initial state) not updating (Actions work perfectly fine)Redux Store(仅返回初始状态)不更新(操作工作正常)
【发布时间】:2018-09-18 00:15:57
【问题描述】:

身份验证完成后,我可以看到操作正在更新,reducer 也在更新 - 但是mapstatetoprops 不会对新的 reducer 状态做任何事情

商店在每次更新时都会记录相同的状态(初始状态)

import React from 'react';
import { bindActionCreators } from 'redux'
import StyledFirebaseAuth from 'react-firebaseui/StyledFirebaseAuth';
import { Redirect } from 'react-router-dom'
import firebase from 'firebase';
import { connect } from 'react-redux';
import { signIn, signOut } from '../reducer/actions'
import { auth } from '../firebase'

class LoginPage extends React.PureComponent {

  // Configure FirebaseUI.
  uiConfig = {'FirebaseUI Config'}

  componentDidMount = () => {
    auth.onAuthStateChanged((user) => { // gets user object on authentication
      console.log('OnAuthStateChanged', user)
      console.log('Check If Props Change in AuthChange', this.props.isauthed)

      if (user) {
        this.props.signIn(user)
      } else {
        this.props.signOut(user)
      }
    });
  }

  render() {
    console.log('Check If Props Change in Render', this.props.isauthed)
    if (!this.props.isauthed) {
      return (
        <div>
          <h1>My App</h1>
          <p>Please sign-in:</p>
          <StyledFirebaseAuth uiConfig={this.uiConfig} firebaseAuth={firebase.auth()} />
        </div>
      );
    }
    return (
      <Redirect to='/' />
    )
  }
}

export default (LoginPage);

应该调度和更新道具的JS

import { connect } from 'react-redux';
import { signIn, signOut } from '../reducer/actions'
import { bindActionCreators } from 'redux'
import LoginPage from './LoginPage';

const mapStateToProps = (state) => {
  console.log('LOGINmapstatetoprops', state.Authed)
  return {
    isauthed: state.Authed.isauthed,
  }
}

const mapDispatchToProps = (dispatch) => {
  console.log('LOGINmapDISPATCHoprops')
  return bindActionCreators({signIn, signOut}, dispatch)
}


  export default connect(mapStateToProps, mapDispatchToProps)(LoginPage);

减速器

import LoginPage from '../components/LoginPage';
import firebase from 'firebase';

const initialState = {
  isauthed: false,
  error: ''
}

const AuthReducer = (state = initialState, action) => {
  console.log('this is an action', action)
  switch (action.type) {
    case 'IsSignedIn':
      return {
        ...state,
        isauthed: action.payload
      }
      break;
    case 'IsNotSignedIn':
      return {
        ...state,
        isauthed: action.payload
      }
      break;
    default: return state
  }
}

export default AuthReducer;

这是动作文件

export const signIn = (user) => {
  console.log('this is from actions', user)
  return {
    type: 'isSignedIn',
    payload: true
  }
}

export const signOut = (user) => {
  console.log(user)
  return {
    type: 'isNotSignedIn',
    payload: false
  }
}

Redux 商店

import { createStore } from 'redux';
import logger from 'redux-logger';
import { createEpicMiddleware } from 'redux-observable';
import {AllReducers} from './reducer/index';
//import rootEpic from './modules/rootEpic';

//const epicMiddleware = createEpicMiddleware(rootEpic);

const store = createStore(AllReducers);

store.subscribe(() => {
  console.log('storeupdated', store.getState())
});

export default store;

CombineReducers 函数

import {combineReducers} from 'redux'
import {AuthReducer} from './AuthReducer'
import {UserReducer} from './UserReducer'

export const AllReducers = combineReducers({
  Authed: AuthReducer 
  User:   UserReducer
})

【问题讨论】:

  • 您的操作以isSignedInisNotSignedIn 类型调度操作,而您的reducer 期望IsSignedInIsNotSignedIn 使用大写字母。我建议在动作类型中使用所有大写字母,因为它们是常量。也如文档中所述redux.js.org/basics/actions
  • 非常感谢伙计,这正是问题所在,愚蠢的我忘了这个

标签: reactjs typescript redux react-redux redux-thunk


【解决方案1】:

您在'isSignedIn''IsSignedIn' 之间似乎有拼写错误(首字母不同)

您可以通过使用在单独文件中声明的变量来避免这种情况。对于动作类型,我喜欢称它为types.js

// types.js
export const IS_SIGNED_IN = 'isSignedInOrEvenWhateverButYouBetterKeepAClearName'
// (same with all your types)

然后你可以在你的其他文件中导入这个变量。你不会再有错别字了!

P.S:你可以在reduxdocumentation找到所有这些想法

【讨论】:

  • 非常感谢伙计!傻我怎么会错过它,现在它没有重定向(可能是因为我在滥用连接方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2021-03-29
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多