简体   繁体   English

使用选择器 State 未定义

[英]UseSelector State is Undefined

The page does not render, citing TypeError: state is undefined , tracing back to this line in SelectForm.js : const filter = useSelector(state => state.filter);页面未呈现,引用TypeError: state is undefined ,追溯至SelectForm.js中的这一行: const filter = useSelector(state => state.filter); . .

I've spent hours trying to figure out what I'm doing wrong.我花了几个小时试图弄清楚我做错了什么。 I've tried createSelector but that didn't work.我已经尝试过 createSelector 但没有奏效。 I've tried dispatching a "Fetch Initial State" action, and that didn't work.我尝试发送“获取初始状态”操作,但没有成功。 The component is wrapped in provider tags.该组件被包装在提供者标签中。 I'm not sure why I don't have access to the state.我不确定为什么我无法访问 state。 At this point I'm unable to see any flaws I've been looking at it for so long.在这一点上,我看不到任何我一直在寻找它的缺陷。

Code Snippets代码片段

reducer.js减速器.js

let initialState = {
    filter: {
        country: null,
        state: null,
        level: null,
        team: null
    },

    isDBConnecting: false, 
    isDBConnected: false, 
    isDBError: false 
}

const SelectorReducer = (state=initialState, action) => {
    switch (action.type) {        
        case 'DB_CONNECT_INIT':
            return {
                ...state,
                isDBConnecting: true,
                isDBConnected: false,
                isDBError: false,
            };
...
...
}

export default SelectorReducer;

actions.js动作.js

export const initializeDBConnection = () => {
    return {
        type: 'DB_CONNECT_INIT'
    }
};

ParentComponent.js父组件.js

import React from 'react';
import { createStore } from 'redux';
import { Provider } from 'react-redux'; //import provider to provide component access to the state

//Component imports
import SelectForm from './components/SelectForm'
import SelectorReducer from '.../reducer.js'

const SelectorStore = createStore(SelectorReducer);

const ParentComponent = () => {

    return (
        <div className="page-container">
            <div id="carousel">
                <div id="wrapper">
                    <Provider store={SelectorStore}>
                        <SelectForm />
                    </Provider>
                </div>
            </div>
    </div>
    )
}

SelectForm.js (Child Component, wrapped in Provider tags above) SelectForm.js(子组件,包裹在上面的 Provider 标签中)

//IMPORTS
import React from 'react'; //import react
import { useSelector, useDispatch } from 'react-redux';

//COMPONENT IMPORTS
import FormGroup from '../FormGroup';
import { * as actions } from '.../actions.js';

const SelectForm = (props) => {

    //STATEFUL IMPORTS
    //filter
    const filter = useSelector(state => state.filter);

Credit to @NicholasTower for the answer in the comments.感谢@NicholasTower 评论中的答案。 My reducer did not have a default case in which我的减速器没有默认情况

default: return state

Putting that in solved the issue.把它放进去解决了这个问题。

  let filter = useSelector(state => {
    console.log('State: ', state);
    return state.pieChart.filter;
  });

Make sure that you are using the correct object for state .确保为 state 使用正确的state

Add a console for debugging and check the state object.添加一个用于调试的控制台并检查state object。 Many times we use multiple reducers which makes our component state nested in global object.很多时候我们使用多个reducers ,这使得我们的组件state嵌套在全局 object 中。

Inside ParentComponent.js you are saying <Provider store={TeamSelectorStore}> .在 ParentComponent.js 中,您说的是<Provider store={TeamSelectorStore}> I think you meant to say <Provider store={SelectorStore}>我想你的意思是说<Provider store={SelectorStore}>

Sometimes having a break in the switch block of the reducer can cause the prop not defined in the state.有时减速器的开关块中断会导致 state 中未定义的道具。

This error can also happen because of an uppercase / lowercase mistake.由于大写/小写错误也可能发生此错误。

let horns = useSelector(state => state.largeRhinohorns);
let horns = useSelector(state => state.largeRhinoHorns);

We should import useSelector form react-redux and then select user details form store in the following way我们应该通过以下方式导入 useSelector 表单 react-redux 然后 select 用户详细信息表单存储

import { useSelector } from 'react-redux'

const User = () => {

const userInfo= useSelector(state => state.user)

return <div>userInfo.name</div>

}

In my case I was storing the data coming from Redux state at didMount stage whereas the Redux states weren't fully uploaded yet.就我而言,我在 didMount 阶段存储来自 Redux state 的数据,而 Redux 状态尚未完全上传。

  const currentUser = useAuth();
  useEffect(() => {
    form.setFieldValue('email', currentUser.email);
  }, []);

Adding currentUser to useEffect dependency array, get it resolved for me:currentUser添加到useEffect依赖数组,为我解决它:

  useEffect(() => {
    form.setFieldValue('email', currentUser.email);
  }, [currentUser]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM