프로젝트/[react]weather_app
[weather_app_5] api에서 정보를 가져와서 적용하기
samsaraA
2018. 4. 29. 16:04
사용할 날씨 api => openWeatherMap
https://openweathermap.org/api
Current weather data 를 subscribe
가입해야함. key를 얻자
const API_KEY = "apiKey"
api doc (https://openweathermap.org/current)
By geographic coordinates
API call:
api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}
_getWeather = (lat, lng) => {
fetch(`http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&APPID=${API_KEY}`)
.then(response => response.json())
.then(json => {
console.log(json)
})
}
${lat}
$ 붙혀줘야하고 fetch할때 ' 가 아닌 tap 위의 키로 감싸줘야함 - > `
weather code와 온도 가져오기
state = {
isLoaded: false,
error: null,
temperature: null,
name: null
};
temp와 name의 위치는 console.log(json)으로 확인
_getWeather = (lat, lng) => {
fetch(`http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&APPID=${API_KEY}`)
.then(response => response.json())
.then(json => {
this.setState({
temperature: json.main.temp,
name: json.weather[0].main,
isLoaded: true
})
})
}
리팩토링
stateless컴포넌트로
// export default class Weather extends Component {
// render() {
// return (
// <LinearGradient
// colors={["#00C6FB", "#005BEA"]} //from-to 색상 지정
// style={styles.container} //스타일
// >
// <View style={styles.upper}>
// <Ionicons color="white" size={144} name="ios-rainy" />
// <Text style={styles.temp}>25˚</Text>
// </View>
// <View style={styles.lower}>
// <Text style={styles.title}>Rainning</Text>
// <Text style={styles.subtitle}>For more info look outside</Text>
// </View>
// </LinearGradient>
// );
// }
// }
function Weather(){
return(
<LinearGradient
colors={["#00C6FB", "#005BEA"]} //from-to 색상 지정
style={styles.container} //스타일
>
<View style={styles.upper}>
<Ionicons color="white" size={144} name="ios-rainy" />
<Text style={styles.temp}>25˚</Text>
</View>
<View style={styles.lower}>
<Text style={styles.title}>Rainning</Text>
<Text style={styles.subtitle}>For more info look outside</Text>
</View>
</LinearGradient>
)
}
export default Weather;
props주기
app.js
const { isLoaded, error, temperature } = this.state;
{isLoaded ? <Weather temp={temperature} /> : (
weather.js
import PropTypes from 'prop-types';
function Weather({ temp }){
return(
<LinearGradient
colors={["#00C6FB", "#005BEA"]} //from-to 색상 지정
style={styles.container} //스타일
>
<View style={styles.upper}>
<Ionicons color="white" size={144} name="ios-rainy" />
<Text style={styles.temp}>{temp}˚</Text>
</View>
<View style={styles.lower}>
<Text style={styles.title}>Rainning</Text>
<Text style={styles.subtitle}>For more info look outside</Text>
</View>
</LinearGradient>
);
}
Weather.propTypes = {
temp: PropTypes.number.isRequired
}
캘빈을 변경하기
내림처리
{isLoaded ? <Weather temp={Math.floor(temperature - 273.15)} /> : (
name
https://openweathermap.org/weather-conditions
const weatherCases = {
Rain: {
colors:["#00C6FB", "#005BEA"],
title: "Raining",
subtitle: "우산 챙기세요",
icon: "ios-rainy"
},
Clear: {
colors:["#FEF253", "#FF7300"],
title: "Sunny",
subtitle: "날이 좋아요",
icon: "ios-sunny"
},
Thunderstorm: {
colors:["#00ECBC", "#007ADF"],
title: "Thunderstrom",
subtitle: "천둥이쳐요!",
icon: "ios-thunderstorm"
},
Clouds: {
colors:["#D7D2CC", "#304352"],
title: "Clouds",
subtitle: "구름이 꼈어요",
icon: "ios-cloudy"
},
Snow: {
colors:["#7DE2FC", "#B9B6E5"],
title: "Snow",
subtitle: "눈이와요!",
icon: "ios-snow"
},
Drizzle: {
colors:["#89F7FE", "#66A6FF"],
title: "Drizzle",
subtitle: "이슬비가 내려요",
icon: "ios-rainy-outline"
},
Haze: {
colors:["#89F7FE", "#66A6FF"],
title: "Haze",
subtitle: "이슬비가 내려요",
icon: "ios-rainy-outline"
},
Mist: {
colors:["#89F7FE", "#66A6FF"],
title: "Mist",
subtitle: "이슬비가 내려요",
icon: "ios-rainy-outline"
}
}
강의에는 Mist가 없는데 지금 날씨가 Mist라 오류.. Mist 따로 정의해줬다!
function Weather({ weatherName , temp }){
return(
<LinearGradient
colors={weatherCases[weatherName].colors} //from-to 색상 지정
style={styles.container} //스타일
>
<View style={styles.upper}>
<Ionicons color="white" size={144} name={weatherCases[weatherName].icon} />
<Text style={styles.temp}>{temp}˚</Text>
</View>
<View style={styles.lower}>
<Text style={styles.title}>{weatherCases[weatherName].title}</Text>
<Text style={styles.subtitle}>{weatherCases[weatherName].subtitle}</Text>
</View>
</LinearGradient>
);
}
App.js 에서는 props를 넘겨줘야함
render() {
const { isLoaded, error, temperature, name } = this.state;
return (
<View style={styles.container}>
<StatusBar hidden={true} />
{isLoaded ? <Weather weatherName={name} temp={Math.floor(temperature - 273.15)} /> : (
<View style={styles.loading}>
<Text style={styles.LoadingText}>Getting the weather</Text>
{error ? <Text style={styles.errorText}>{error}</Text> : null}
</View>
)}
</View>
);
}