gpt4 book ai didi

javascript - 访问作为对象的 reducer 有效负载的元素

转载 作者:行者123 更新时间:2023-11-30 14:51:28 25 4
gpt4 key购买 nike

这是一个基本的天气应用程序,我正在使用它来学习 Redux。 API 不提供搜索的城市名称,因此我必须通过 Redux 传递它。

我有以下容器:

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

class WeatherList extends Component {
renderWeather = cityData => {
const conditions =
cityData.forecast.simpleforecast.forecastday[0].conditions;
const fHigh =
cityData.forecast.simpleforecast.forecastday[0].high.fahrenheit;
return (
<tr>
{/* <td>{cityData.city}</td> */}
<td>{cityData.meta.city}</td>
<td>{conditions}</td>
<td>{fHigh}</td>
</tr>
);
};
render() {
return (
<table className="table table-hover">
<thead>
<tr>
<th>City</th>
<th>Conditions</th>
<th>High (F)</th>
<th>Humidity</th>
</tr>
</thead>
{/* <tbody>{this.props.weather.map(this.renderWeather)}</tbody> */}
<tbody>{this.props.weather.data.map(this.renderWeather)}</tbody>
</table>
);
}
}

const mapStateToProps = ({ weather }) => ({
weather
});

export default connect(mapStateToProps)(WeatherList);

this.props.weather.data.map 抛出“无法读取未定义的属性映射”的错误。

提供“天气”状态的 reducer 是:

import { FETCH_WEATHER } from "../actions/index";

export function WeatherReducer(state = [], action) {
switch (action.type) {
case FETCH_WEATHER:
console.log(action.payload.data);
console.log(action.meta.city);
return { data: [action.payload.data, ...state], meta: action.meta.city };
// return [action.payload.data, ...state];
}
return state;
}

最后是相关的 Action 创建器:

import axios from "axios";

const API_KEY = "e95fb12f6c69ae61";
const ROOT_URL = `http://api.wunderground.com/api/${API_KEY}/forecast/q/`;

export const FETCH_WEATHER = "FETCH_WEATHER";

export function fetchWeather(searchData) {
const url = `${ROOT_URL}${searchData.stateName}/${searchData.city}.json`;
const request = axios.get(url);

return {
type: FETCH_WEATHER,
payload: request,
meta: { city: searchData.city }
};
}

您可以从注释掉的代码中看到,如果我只传递一个数组进行迭代,我就可以让它工作。但我需要传递更多信息才能获得一个人搜索的城市名称。我该怎么做才能读取状态对象的第一个元素(数组)并消除未定义的错误?

非常感谢任何想法!

最佳答案

由于 WeatherReducer 返回具有数据和元属性的对象,因此您必须将其声明为 initialState 中的对象。你的 reducer 必须看起来像

const initialState = {
data: [],
meta: ''
}
export function WeatherReducer(state = initialState, action) {
switch (action.type) {
case FETCH_WEATHER:
console.log(action.payload.data);
console.log(action.meta.city);
return { data: [action.payload.data, ...state.data], meta: action.meta.city };
}
return state;
}

错误可能会出现,因为在 fetchWeather 操作被触发之前,最初返回一个空数组作为 reducer 值,因此 this.props.weather.data 将是 未定义。在这种情况下要遵循的另一件事是有条件地使用所有这些在特定时间点可能未定义的值

关于javascript - 访问作为对象的 reducer 有效负载的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044208/

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