gpt4 book ai didi

javascript - TypeError : this. props.weather 未定义

转载 作者:行者123 更新时间:2023-12-03 00:49:05 25 4
gpt4 key购买 nike

我正在开发一个应用程序,它将帮助我使用 openweathermap.org 获取任何城市的五天天气预报,但是,每当我在 WeatherList 容器中调用函数 renderWeather 时,我都会在浏览器中收到上述错误,如图所示在我下面的代码片段中。

这个文件是我导入redux Promise的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 App from './components/app';
import reducers from './reducers';

const createStoreWithMiddleware = applyMiddleware(ReduxPromise)(createStore);

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

weather_list 容器的代码如下

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

class WeatherList extends Component{

renderWeather(cityData){
return(
<tr>
<td>{cityData.city.name}</td>
</tr>
);

}

render(){
return(
<table className="table table-hover">
<thead>
<tr>
<th>City</th>
<th>Temperature</th>
<th>Pressure</th>
<th>Humidity</th>
</tr>
</thead>
<tbody>
{this.props.weather.map(this.renderWeather)}
</tbody>
</table>
);
}
}
function mapStateToProps(state){
return {
weather: state.weather
};
}
export default connect(mapStateToProps)(WeatherList);

search_bar 容器的代码如下

import React, {Component}from 'react';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
import {fetchWeather} from '../actions/index';

class SearchBar extends Component{
constructor(props){
super(props);

this.state = {term: ''};
this.onInputChange = this.onInputChange.bind(this);
this.onFormSubmit = this.onFormSubmit.bind(this);
}

onInputChange(event){
console.log(event.target.value);
this.setState({term: event.target.value});
}

onFormSubmit(event){
event.preventDefault();
// we need to go and fetch weather data!
this.props.fetchWeather(this.state.term);
this.setState({term: ''});
}

render(){
return(
<form onSubmit={this.onFormSubmit} className="input-group">
<input
placeholder="Get a five-day forecast in your favorite cities"
className="form-control"
value={this.state.term}
onChange={this.onInputChange} />
<span className="input-group-btn">
<button type="submit" className="btn btn-secondary">Submit</button>
</span>
</form>
);
}
}
function mapDispatchToProps(dispatch){
return bindActionCreators({fetchWeather:fetchWeather}, dispatch)
}

export default connect(null, mapDispatchToProps)(SearchBar);

应用程序组件的代码如下所示

import React, { Component } from 'react';
import SearchBar from '../containers/search_bar.js';
import WeatherList from '../containers/weather_list.js';


export default class App extends Component {
render() {
return (
<div>
<SearchBar />
<WeatherList />
</div>
);
}
}

天气减少器的代码如下所示

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

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

reducers文件夹中index.js的代码如下所示

import { combineReducers } from 'redux';
import WeatherReducer from './reducer_weather';

const rootReducer = combineReducers({
weather: WeatherReducer
});

export default rootReducer;

操作文件夹中操作创建者的代码如下所示

import axios from 'axios';
const API_KEY = '03d17752ca362bc60ca7df94aac228a6';
const ROOT_URL =`https://api.openweathermap.org/data/2.5/forecast?appid=${API_KEY}`;

export const FETCH_WEATHER = 'FETCH_WEATHER';

export function fetchWeather(city){
const url = `${ROOT_URL}&q=${city},us`;
const request = axios.get(url);

console.log('Request:', request);

return{
type: FETCH_WEATHER,
payload: request
}
}

最后,下面是显示浏览器中错误的图像。 enter image description here

非常感谢有关如何解决该错误的任何帮助

最佳答案

最初 this.props.weather 将是未定义的,因此您需要在执行 .map 之前进行条件检查,就像以两种方式进行

this.props.weather && this.props.weather.map

或者

Array.isArray(this.props.weather) && this.props.weather.map

此外,在执行 .map 时,您需要将天气数据传递给 renderWeather 方法,因为它需要数据,但您没有在 .map 中将数据传递给它

改变

{this.props.weather.map(this.renderWeather)}

 {Array.isArray(this.props.weather) && this.props.weather.map(item => this.renderWeather(item))}

同时在此处为 tr 元素设置唯一键

renderWeather(cityData){
return(
<tr key={cityData.city && cityData.city.id}> //if you do not have unique id then use index as key
<td>{cityData.city && cityData.city.name}</td>
</tr>
);
}

或者如果您的数据不包含唯一 ID,则使用索引作为键

 {Array.isArray(this.props.weather) && this.props.weather.map((item, index) => this.renderWeather(item, index))}

同时在此处为 tr 元素设置唯一键

renderWeather(cityData, index){
return(
<tr key={"city-"+index}> //if you do not have unique id then use index as key
<td>{cityData.city && cityData.city.name}</td>
</tr>
);
}

关于javascript - TypeError : this. props.weather 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53129700/

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