Javascript Can';t检查是否定义了props中的值

Javascript Can';t检查是否定义了props中的值,javascript,reactjs,redux,Javascript,Reactjs,Redux,所以我一直在尝试用几种方法来解决这个问题,但没有一种方法真的有效。 我将Redux与React一起使用,因此我希望使用React组件中存储的日期 问题是,数据不是第一次渲染时的数据,因此我尝试访问的变量未定义 const{errors}=this.props; 让errorList=null; 如果(错误){ errorList=Object.keys(this.props.error).map(function(key){ return{errors[key]}; }); } 我试着用我想要

所以我一直在尝试用几种方法来解决这个问题,但没有一种方法真的有效。 我将Redux与React一起使用,因此我希望使用React组件中存储的日期

问题是,数据不是第一次渲染时的数据,因此我尝试访问的变量未定义

const{errors}=this.props;
让errorList=null;
如果(错误){
errorList=Object.keys(this.props.error).map(function(key){
return
  • {errors[key]}
  • ; }); }
    我试着用我想要使用的道具值做一个常量,但这没有用,因为它也没有定义

    我尝试编写一个简单的if语句来检查值是否未定义,但仍然没有成功:

    if(this.props.errors&&typeof this.props.errors!=='undefined'){…}
    
    在我的减速器中,我有一个初始状态,所以我不确定为什么它会变得未定义。也许我只是做错了初始化。。 这是我的减速机:

    从“../actions/creators/types”导入{SET_ERRORS};
    常量initialState={}
    导出默认函数reduceError(状态=初始状态,操作){
    开关(动作类型){
    案例集错误:
    返回动作。有效载荷;
    违约:
    返回状态;
    }
    }
    
    我搜索了一个解决方案,其中一些建议使用componentWillReceiveProps,但这是不推荐的,如果有更好的解决方案,我不想使用它

    我如何确保代码只在道具到达时运行?我在表单中使用这个函数来获取错误消息,但是我也有不同的函数,它们也不起作用。他们中的一些人会,但我在这里做着完全相同的事情,而这只是没有。

    我在

    errorList = Object.keys(this.props.error).map(function(key) {
    

    this.props.error应该是“errors”。

    这就是我如何使用Redux从存储中提取状态并在组件中使用。这可能不会解决您所有的问题,但会显示一个简明的示例

    import React, {useEffect} from 'react'
    import {useDispatch, useSelector} from "react-redux";
    import getStuffFromDB from "../actions/getStuff"
    
    const Example = () => {
    
        const dispatch = useDispatch();
    
        const stuffFromState = useSelector(state => state.stuff); // stuff is part of our state in the store
        const {error, loading, stuff} = stuffFromState; // destructure state
    
        useEffect(()=>{
            dispatch(getStuffFromDB()) // get stuff from the database
        }, [dispatch])
    
        return (
            <>
                {/* Show loader if loading */}
                {loading && <Loader />}
                {/* Show error message if exists */}
                {error && <Message severity="error">{error}</Message>}
                <div>
                    <p>{stuff}</p>
                </div>
            </>
        )
    }
    
    export default Example
    
    行动示例:

    export const getStuffFromDB = () => async dispatch => {
        try {
            dispatch({ type: STUFF_FROM_DATABASE_REQUEST });
            const { data } = await axios.get("/api/stuff");
            dispatch({ type: STUFF_FROM_DATABASE_SUCCESS, payload: data });
        } catch (error) {
            dispatch({
                type: STUFF_FROM_DATABASE_FAIL,
                payload:
                    error.response && error.response.data.message
                        ? error.response.data.message
                        : error.message,
            });
        }
    };
    
    商店设置:

    import { createStore, combineReducers, applyMiddleware } from "redux";
    import thunk from "redux-thunk";
    import { composeWithDevTools } from "redux-devtools-extension";
    
    
    const reducer = combineReducers({
        stuff: getStuffReducer,
    });
    
    // Set initial state
    const initialState = {};
    
    // Configure thunk middleware
    const middleware = [thunk];
    
    // Configure store
    const store = createStore(
        reducer,
        initialState,
        composeWithDevTools(applyMiddleware(...middleware))
    );
    
    export default store;
    

    您可以在reducer中将错误初始化为空数组或对象。这样就可以定义它:)另外,您可以发布更多的代码吗?我将在明天早些时候检查它,我将在我的减速机中初始化它(如果我做得对的话)。我在问题中添加了reducer代码。我不认为这个问题是由于没有正确初始化错误造成的,因为您在组件中进行了检查。如何将状态连接到组件?
    import { createStore, combineReducers, applyMiddleware } from "redux";
    import thunk from "redux-thunk";
    import { composeWithDevTools } from "redux-devtools-extension";
    
    
    const reducer = combineReducers({
        stuff: getStuffReducer,
    });
    
    // Set initial state
    const initialState = {};
    
    // Configure thunk middleware
    const middleware = [thunk];
    
    // Configure store
    const store = createStore(
        reducer,
        initialState,
        composeWithDevTools(applyMiddleware(...middleware))
    );
    
    export default store;