gpt4 book ai didi

javascript - 使用 redux-thunk 会产生未定义的错误,而 Promise 工作得很好

转载 作者:行者123 更新时间:2023-12-03 02:33:39 24 4
gpt4 key购买 nike

这是我的 reducer :

export default function(state=[], action){
switch (action.type) {
case FETCH_PLACES:
return [action.payload.data];
}
return state;
}

这是我的航类容器:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import moment from 'moment';

class FlightList extends Component {

renderFlights(flightData){
const result = flightData.data.length;
console.log(flightData);
var rows = [];
for (var i = 0; i < result; i++) {
rows.push(
<tr key={i} >
<td>{i+1}</td>,
<td>{flightData.data[i].airlines[0]}</td>,
<td>{flightData.data[i].route[0].flight_no}</td>,
<td>{flightData.data[i].mapIdfrom}</td>,
<td>{flightData.data[i].mapIdto}</td>,
<td>
{
moment.unix(flightData.data[i].dTime).format("YYYY-MM-DD HH:mm")
}
</td>,
<td>
{
moment.unix(flightData.data[i].aTime).format("YYYY-MM-DD HH:mm")
}
</td>,
<td>{flightData.data[i].conversion.EUR} Euro</td>
</tr>
);
}
return <tbody>{rows}</tbody>;
}

render(){
return (
<table className="table table-hover">
<thead>
<tr>
<th>#</th>
<th>Airline</th>
<th>Flight Number</th>
<th>From</th>
<th>To</th>
<th>Departure</th>
<th>Arrival</th>
<th>Cost</th>
</tr>
</thead>
{this.props.flights.map(this.renderFlights)}
</table>
);
}
}

const mapStateToProps=({ flights })=>{
return { flights };
};

export default connect(mapStateToProps)(FlightList);

在我使用 redux-thunk 后,当我尝试运行我的应用程序时,出现以下错误:

Uncaught TypeError: Cannot read property 'data' of undefined

我试图找出导致此问题的原因,如果在我的 reducer 中我将 [action.payload.data] 更改为 [action.payload] 然后我得到错误:

Uncaught TypeError: Cannot read property 'length' of undefined

这是我的 src/index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';

//import ReduxPromise from 'redux-promise';
import thunk from 'redux-thunk';


import App from './components/app';
import reducers from './reducers';

//const createStoreWithMiddleware = applyMiddleware(ReduxPromise)(createStore);
const store = createStore(reducers,applyMiddleware(thunk));

ReactDOM.render(
<Provider store={store}>
<App />
</Provider>
, document.querySelector('.container'));

但无论如何,我总是会得到一个 JSON 文件,其中包含我需要的所有信息,并且在我的容器中我尝试以表格形式发布它们。我不明白是什么原因造成的。有没有办法解决这个问题而不将我的源文件更改为以前的样子?

更新

import axios from 'axios';
import moment from 'moment';

const ROOT_URL = `https://api.skypicker.com/flights`;

//to keep out action type consistent between our action creator and our action reducers
export const FETCH_PLACES = 'FETCH_PLACES';

export function createQueryString(obj){
const Qstring = require('querystring');
const newQuery = Qstring.stringify(obj);
return newQuery;
}

export function fetchPlaces(query) {

let skypicker = {
flyFrom: query.from,
//to: query.to,
dateFrom: query.startDate,
dateTo: query.finishDate,
price_to: query.budget,
partner: "picky"
//partner_market: "yout id"
};

const FormattedDateFrom = moment(skypicker.dateFrom).format('DD/MM/YYYY');
const FormattedDateTo = moment(skypicker.dateTo).format('DD/MM/YYYY');
skypicker.dateFrom = FormattedDateFrom;
skypicker.dateTo = FormattedDateTo;

const queryString = createQueryString(skypicker);
const url = `${ROOT_URL}?${queryString}`;
const request = axios.get(url);

return {
type: FETCH_PLACES,
payload: request
};

}

最佳答案

您没有包含您的 Action 创建者。问题在于您使用 redux-thunk 的方式。

  1. 您在组件/容器中调度操作
  2. 如果分派(dispatch)的操作返回函数,那么 redux-thunk 将执行该函数
  3. 在该函数内,您必须调度另一个将返回对象(类型和从 API 获取的数据)的操作

编辑:

这段代码应该可以完成工作。如果一切正常,您应该将您的 fetchPlaces 操作创建器替换为我的 fetchPlaces 操作创建器。

export function fetchPlaces(query) {
// This is your thunk because we are not retuning object but a function redux-thunk will execute this function
return function(dispatch) {
const skypicker = {
flyFrom: query.from,
dateFrom: query.startDate,
dateTo: query.finishDate,
price_to: query.budget,
partner: 'picky',
}

const FormattedDateFrom = moment(skypicker.dateFrom).format('DD/MM/YYYY')
const FormattedDateTo = moment(skypicker.dateTo).format('DD/MM/YYYY')
skypicker.dateFrom = FormattedDateFrom
skypicker.dateTo = FormattedDateTo

const queryString = createQueryString(skypicker)
const url = `${ROOT_URL}?${queryString}`
axios.get(url).then(function(response) {
// If request was successful you want to dispatch new action
dispatch({
type: FETCH_PLACES,
payload: response,
})
})
}
}

关于javascript - 使用 redux-thunk 会产生未定义的错误,而 Promise 工作得很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com