【问题标题】:state and props are undefined状态和道具未定义
【发布时间】:2021-04-28 12:01:01
【问题描述】:

嗨,我对编码很陌生。我正在使用 react redux 并创建了一个 store、reducers 等。我无法将任何东西渲染到屏幕上,当我 console.log this.props 它出现一个空数组。我处理的数据是一个对象数组,我将初始状态设置为一个对象数组。我用connect和mapstateto props函数连接了所有组件,connect的第一个参数中有一个空对象,第二个参数是组件。当我查看我的组件树时,它看起来很好,但我的状态是未定义的,无法弄清楚为什么?这是我的代码。提前谢谢你。

  export const FETCH_SMURFS_START ="FETCH__SMURFS_START"
export const FETCH_SMURFS_SUCCESS = "FETCH_SMURFS_SUCCESS"
export const FETCH_SMURFS_FAILURE ="FETCH_SMURFS_FAILURE"
export const ADD_SMURF_START = "ADD_SMURF_START"
export const ADD_SMURF_SUCCESS = "ADD_SMURF_SUCCESS"
export const ADD_SMURF_FAILURE = "ADD_SMURF_FAILURE"

export const getSmurfData = () =>dispatch=>{
         
    dispatch({type:FETCH_SMURFS_START})
        console.log(FETCH_SMURFS_START)
   axios.get(' http://localhost:3333/smurfs')
      .then((res)=>{
         console.log(res.data)
          dispatch({type:FETCH_SMURFS_SUCCESS, payload:res.datay})

      })
          
      .catch((err)=> {
          dispatch({type:FETCH_SMURFS_FAILURE, payload:err.message})
      })

}

export const putSmurfData = () =>dispatch=>{

    dispatch({type:ADD_SMURF_START})
        console.log(ADD_SMURF_START)
        dispatch({ADD_SMURF_SUCCESS})
   axios.put(' http://localhost:3333/smurfs')
      .then((res)=>{
          
          dispatch({type:ADD_SMURF_SUCCESS, payload:res.data})

      })
          
      .catch((err)=> {
          dispatch({type:ADD_SMURF_FAILURE, payload:err.message})
      })

}

class SmurfDisplay extends React.Component {
  componentDidMount() {
    getSmurfData();
  }

  render() {
    return (
        <>
      <div>
        {this.props.newSmurfData.map((smurf, index) => (
          <div>
            <h4 key={smurf.id}></h4>
            <p> {index}</p>
            <p>{smurf.description}</p>
            <p>{smurf.nickname}</p>
            <p>{smurf.name}</p>
            <p>{smurf.position}</p>
          </div>
        ))}
      </div>
      
      </>
    );
  }
}

const mapStateToProps = (state) => {
  return {
    newSmurfData: [
      {
        error:state.error,
        id: state.id,
        name: state.name,
        position: state.position,
        nickname: state.nickname,
        description: state.description,
      },
    ],
  };
};

export default connect(mapStateToProps, {})(SmurfDisplay);
class Smurf extends React.Component {
    render() {
        console.log(this.props);
        return (
            <>
            
                  {this.props.smurfData.map(function(smurf,index) {
                      return(
                      
                <div>
                      <h4 key={index}></h4>
                      <p>{smurf.description}</p>
                      <p>{smurf.nickname}</p>               
                      <p>{smurf.name}</p>
                      <p>{smurf.position}</p>
                   
              </div>
                      )  
                  })}

                  
            
    </>
            
                  
        )
    }
}










const mapStateToProps = (state) =>{
    return{

        smurfData:[{
            error:state.error,
            id:state.id,
            name:state.name,
            position:state.position,
            nickname:state.nickname,
            description:state.description
        }]
    

    }
}
export default connect(mapStateToProps,{})(Smurf)
xport const initialState = {
        error:"",
        isLoading: false,
        smurfData : [{
            id:"",
            name:"",
            position:"",
            nickname:"",
            description:""

        }],

        error:"",
        isAddingSmurf:false,
        newSmurfData:[{
            id:"",
            name:"",
            position:"",
            nickname:"",
            description:""
        }],
     
        
        }
        




export const reducer = (state = initialState,action) =>{
                switch(action.type){
         case FETCH_SMURFS_START:
                  return{
                    ...state,
                    isLoading:true,
                    error:""
                }
        case FETCH_SMURFS_SUCCESS:
                return{
                    ...state,
                    isLoading:false,
                    smurfData:action.payload
                }
        case FETCH_SMURFS_FAILURE:
            return{
                ...state,
                isLoading:false,
                error:"there was an error getting your smurfs"
            }
                
        case ADD_SMURF_START:
            return{
                ...state,
                isAddingSmurf:false,
                error:""
            }
        case ADD_SMURF_SUCCESS:
            return{
                ...state,
                isAddingSmurf:true,
                error: "",
                newSmurfData:action.payload
            }
        case ADD_SMURF_FAILURE:
            return{
                ...state,
                isAddingSmurf:false,
                addingError:"Error"
            }
                    default:
                    return state



    }
}

export default reducer;

【问题讨论】:

  • 您的操作设置为在mapDispatchToProps 中使用,但您没有使用connect 的第二个参数。
  • 由于您不熟悉编码和 React,我建议您立即停止使用基于类的组件,而改用函数式组件。使用基于类的组件并没有任何优势,而切换到功能组件可以消除很多可能的错误。功能组件是解决基于类组件的各种问题的较新解决方案。事实上,您遇到的错误甚至不可能在功能组件中发生。

标签: reactjs redux


【解决方案1】:

当你想在class Component 中使用this.props 时,你需要在构造函数中使用super(props)

constructor(props){
   super(props)
}

【讨论】:

  • 实际上这几年没有必要。你根本不需要调用构造函数,它被称为隐式。你也可以在外面定义你的状态,这会让你的代码更干净。
  • @buzatto 有趣,谢谢我不知道
猜你喜欢
  • 2020-06-21
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多