React-Redux-Saga TypeError:无法读取null的属性“数据”

时间:2019-04-10 04:27:35

标签: react-redux redux-saga

请让我知道过去三天都被卡住了。我是Redux Saga的新手,我不知道我要怎么做。刚开始时我没有太多经验,所以不太了解Sagas :(。但是我想了解它。

我需要在折线图中显示销售数据,这是我的代码

Json数据样本

{"data":[{"year":"2014","Sales":4390,"Orders":3800},{"year":"2013","Sales":4490,"Orders":4300},{"year":"2015","Sales":2200,"Orders":3400},{"year":"2016","Sales":1280,"Orders":2398},{"year":"2017","Sales":5000,"Orders":4300},{"year":"2018","Sales":4780,"Orders":2908},{"year":"2019","Sales":5890,"Orders":4800}]}

管理员文件夹

adminActions.js

                import {GET_SALES_DATA} from '../constants/actionTypes';
                export const getSales =()=>({
                type:GET_SALES_DATA
                });

adminReducer.js

                import {GET_SALES_DATA,SALES_DATA_RECEIVED} from '../constants/actionTypes';

                const adminReducer=(state={},action)=>{
                    switch(action.type){
                        case GET_SALES_DATA:
                            return {...state};
                        case SALES_DATA_RECEIVED:
                            return {...state,payload:action.salesDataPerYear}  **//issue here   payload data is not received state is not getting updated with the data**
                        default:
                            return state;
                    }
                }

                export default adminReducer;

adminSaga.js

                import {put,takeLatest,all} from 'redux-saga/effects';
                import {GET_SALES_DATA,SALES_DATA_RECEIVED} from '../constants/actionTypes';

                function *getSales(){
                console.log("5saga")
                const salesDataPerYear=yield fetch("api call")
                    .then(response=>response.data);


                yield put({type:SALES_DATA_RECEIVED,salesDataPerYear:salesDataPerYear})
                }


                function *actionWatcher(){
                yield takeLatest(GET_SALES_DATA,getSales)
                }

                export default function *rootSaga(){
                yield all([
                    actionWatcher(),
                ]);
                }

dashboard.js

                const mapStateToProps=(state)=>({
                data:state.salesDataPerYear
                })

                const mapDispatchToProps = {
                getSales:getSales
                };


                class DashboardMain extends React.Component {

                componentDidMount(){
                this.props.getSales()
                }

                render() {
                const { classes,data } = this.props;
               // const  { data } =this.state;
                **console.log(data)// data not rendering in console is the saga i've written is correct?**

                return (
                <div className={classes.root}>   
                    <Grid container spacing={24}>
                        <Grid item xs={12}>
                        <SimpleLineChart data={data} />**//commented**
                        </Grid>
                        <Grid item xs={12}>
                        <SimpleTable /> 
                        </Grid>
                    </Grid>
                </div>
                );
                }
                }

                DashboardMain.propTypes = {
                classes: PropTypes.object.isRequired,
                };

                const Dashboard=connect(mapStateToProps,mapDispatchToProps)(DashboardMain);

simleLineChart.js(已更新)

    <LineChart data={ this.props.data }> **// TypeError: Cannot read property 'props' of undefined**

以下是商店文件夹

  index.js

            import createSagaMiddleware from 'redux-saga';
            import {createStore,applyMiddleware} from 'redux';
            import {logger} from 'redux-logger';
            import rootSaga from '../adminDashboard/adminSaga';
            import reducers from '../adminDashboard/adminReducers';

            const sagaMiddleware=createSagaMiddleware();

            const store=createStore(
            reducers,
            applyMiddleware(sagaMiddleware,logger),
            );

            sagaMiddleware.run(rootSaga);

            export default store;

数据没有显示在折线图中。我知道我的传奇出现了一些错误,但我不知道它是什么:(。

任何人都可以让我知道我要去哪里了。我错过的任何东西。任何帮助表示赞赏。

更新

未在控制台中呈现的数据是我写的传奇故事,还是我错过了某些东西?

                undefined
                redux-logger.js:389  action GET_SALES_DATA @ 12:38:06.302
                redux-logger.js:400  prev state {}
                redux-logger.js:404  action     {type: "GET_SALES_DATA"}type: "GET_SALES_DATA"__proto__: Object
                redux-logger.js:413  next state {}
                adminSaga.js:7 5saga

                            Response {type: "cors", url: "API call", redirected: false, status: 200, ok: true, …}body: (...)bodyUsed: falseheaders: Headers {}ok: trueredirected: falsestatus: 200statusText: "OK"type: "cors"url: "API call"__proto__: Response
                            redux-logger.js:389  action SALES_DATA_RECEIVED @ 12:38:07.103
                            redux-logger.js:400  prev state {}__proto__: Object
                            redux-logger.js:404  action     {type: "SALES_DATA_RECEIVED", payload: Response, @@redux-saga/SAGA_ACTION: true}payload: Responsebody: (...)bodyUsed: falseheaders: Headers {}ok: trueredirected: falsestatus: 200statusText: "OK"type: "cors"url: "API call"__proto__: Responsetype: "SALES_DATA_RECEIVED"@@redux-saga/SAGA_ACTION: true__proto__: Object
                            redux-logger.js:413  next state {payload: undefined}payload: undefined__proto__: Object

我评论了simpleLineChart的传奇和减速器问题,我没有得到结果。我用日志更新了,请检查。 API调用正在检索数据。但是在减速器中,我做错了,我不知道。请隐瞒

1 个答案:

答案 0 :(得分:0)

工作就像一个魅力四射:) ufff三天后。我学到了很多有价值的东西。这句话对我来说是正确的:“我们从错误中学习了更多”感谢@RussCoder

adminSaga.js

                    try{
                        const salesDataPerYear=yield fetch("https://api.myjson.com/bins/78b9w")
                                .then(response=>response.json())
                        yield put({type:SALES_DATA_RECEIVED,payload:salesDataPerYear.data})
                    }

adminReducer.js

                    case SALES_DATA_RECEIVED:
                    return {...state,payload:action.payload };  

dashbord.js

   const mapStateToProps=state=>{
      return{   
        dataSales:state  //have changes data to dataname
      }
     };