【问题标题】:useSelector hook first returns undefined state and after an action call returns the state correctlyuseSelector 钩子首先返回未定义的状态,然后在动作调用正确返回状态
【发布时间】:2020-04-21 21:36:24
【问题描述】:

我是 React 钩子的新手,我尝试将我的项目与 redux 集成,问题是在我用于 login 的函数组件中,当我尝试使用 useSelector 获取我的 initialState 属性时,状态是未定义的。

import React, {useState} from 'react';
import loginStyles from './login.module.css';
import {useDispatch , useSelector, shallowEqual} from 'react-redux';
import {login} from '../../store/actions/actions';

export default (props) =>  {

    const initialState = {
        "email":'',
        "password":''
    }
    const dispatch = useDispatch();

    const [loginForm, setValue] = useState(initialState);


    const changeValue = (event) => {
        const name = event.target.name;
        const value = event.target.value;
        setValue(prevState => {
            return {
                ...prevState,
                [name]: value
            }
        });

    }



    useSelector((state) => {
       console.log(state)
    });


    return (
        <article className={loginStyles.main}>
            <aside className={loginStyles.left}>

            </aside>
            <aside className={loginStyles.right}>
                <div>
                    <input name="email" onChange={(event) => changeValue(event) } type = "text" value = {loginForm['email']} />
                    <input name="password" onChange={(event) => changeValue(event) } type = "text" value = {loginForm['password']} />
                    <button onClick={() => dispatch(login("jared", true))} >clicl</button>
                </div>
            </aside>
        </article>
    );

}

单击按钮后,它会打印出正确的 , 状态,但在第一次渲染时会打印出未定义的状态。那我应该修改什么?

这是我的其余代码。谢谢。

App.js


import React from 'react';
import {Provider} from 'react-redux';
import { createStore } from 'redux';
import reducer from './store/reducer';
import Layout from './layouts/main';
import './app.css';
function App() {

const store = createStore(reducer);

  return (
    <Provider store={store}>
      <Layout />
    </Provider>
  );
}

export default App;
import React from 'react';
import {Provider} from 'react-redux';
import { createStore } from 'redux';
import reducer from './store/reducer';
import Layout from './layouts/main';
import './app.css';
function App() {

const store = createStore(reducer);

  return (
    <Provider store={store}>
      <Layout />
    </Provider>
  );
}

export default App;
import React from 'react';
import {Provider} from 'react-redux';
import { createStore } from 'redux';
import reducer from './store/reducer';
import Layout from './layouts/main';
import './app.css';
function App() {

const store = createStore(reducer);

  return (
    <Provider store={store}>
      <Layout />
    </Provider>
  );
}

export default App;

reducer.js

const initialState = {
    logged: false,
    user: null,
    empresas: null
}

const reducer = (state = initialState, action) => {
    switch(action.type) {
        case 'ONLOGIN': {
            return {
                ...state,
                user:action.user,
                logged: true
            }
        }
        case 'ONLOGOUT': {
            return {
                ...state, 
                user: null,
                logged: false
            }
        }
    }
}

export default reducer;

actions.js


const login = (user, logged)=> {
    return {
        type:'ONLOGIN',
        user: user,
        logged: true
    }

}


export {login}

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    您需要在首次加载时获取存储状态以获取初始状态。

    actions.js

    const fetchState = () => {
      return {type: 'FETCH_STATE'}
    }
    

    reducer.js

    const reducer = (state = initialState, action) => {
        switch(action.type) {
            case 'ONLOGIN': {
                return {
                    ...state,
                    user:action.user,
                    logged: true
                }
            }
            case 'ONLOGOUT': {
                return {
                    ...state, 
                    user: null,
                    logged: false
                }
            }
            case 'FETCH_STATE': {
                return {
                    ...state, 
                }
            }
         default:
           return state;
        }
    }
    

    最后在组件中,您需要在首次加载时使用React.useEffectcomponentDidMount 获取状态

    import React, {useState} from 'react';
    import loginStyles from './login.module.css';
    import {useDispatch , useSelector, shallowEqual} from 'react-redux';
    import {login} from '../../store/actions/actions';
    
    export default (props) =>  {
    
        const initialState = {
            "email":'',
            "password":''
        }
        const dispatch = useDispatch();
    
        const [loginForm, setValue] = useState(initialState);
    
       React.useEffect(() => {
         dispatch(fetchState())
       },[])
    
        // remaining code
    

    【讨论】:

      【解决方案2】:

      上面的代码工作正常。我自己运行上面的代码并使用 useSelector 成功获取了 initialState 属性。

      {logged: true, user: "jared", empresas: null} 记录:真 用户:“贾里德” empresas: null。

      您的项目中可能存在类似问题

      1. 你应该检查你是否导出了正确的reducer函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多