context API ์ฌ์ฉํ๋ ์ด์
React๋ ๊ธฐ๋ณธ์ ์ผ๋ก Component๋ง๋ค ์ํ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค.
ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ ์ ์ปค์ง๊ณ ๋ณต์กํด์ง์๋ก ์ปดํฌ๋ํธ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ์ด ๋ง์์ง๊ณ ๋ณต์กํด์ง๋ค.
์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ์ฝ๊ฒ ์ปดํฌ๋ํธ ๊ฐ์ ์ํ๋ฅผ ๊ด๋ฆฌ ํ ์ ์๋ค
Context API๋?
๋ถ๋ชจ๋ถํฐ ์์์๊ฒ props๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ง๋ง,
contex API๋ฅผ ์ด์ฉํ๋ฉด ํธ๋ฆฌ ๋จ๊ณ๋ง๋ค props๋ฅผ ๋๊ฒจ์ฃผ์ง ์์๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์๋ค.
์ธ์ Context API ์ฌ์ฉ ํ๋๊ฐ?
Globalํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ๊ณ ์๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์,
๋น์ทํ ๋ฐ์ดํฐ๋ก๋ ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ (๋ก๊ทธ์ธ ๋ฐ์ดํฐ), ํ ๋ง, ์ ํธํ๋ ์ธ์ด ๋ฑ์ด ์๋ค.
์ฃผ์ํ ์
์ ์ญ ๋ฐ์ดํฐ๋ฅผ ํ ๊ณณ์์ ์ ์ฅํ๊ณ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ ๊ทผํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ฌ์ฉ์ ์ํ๋ ๊ฒ ์ข๋ค.
๋ฌธ์์ ๋ฐ๋ฅด๋ฉด Context๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ํด๋น Context๊ฐ ์์ด๋ ์ฌ์ฌ์ฉ์ด ์ด๋ ค์์ง๋ฏ๋ก ๊ผญ ํ์ํ ๋๋ง ์ฌ์ฉํ๊ธธ ๊ถ์ฅํ๋ค.
Context API ๊ธฐ๋ณธ ์ฝ๋ ์์
React.createContext(defaultValue)
|
> context ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ์ฌ์ฉํ๋ ํจ์๋ค.
> createContextํจ์๋ฅผ ํธ์ถํ๋ฉด Provider์ Consumer ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ค.
> defaultValue๋ ์ด๊ธฐ๊ฐ์ ๋งํ๋ค.(Provider๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋ ์ ์ฉ๋ ๊ฐ)
|
Context.Provider
|
> context์ value๋ฅผ ๋ณ๊ฒฝํ๋ ์ญํ ์ ํ๋ค.
> Provider๋ฅผ ์ฌ์ฉํ ๋์๋ value๋ฅผ ๊ผญ ๋ช
์ํด์ฃผ์ด์ผ๋ง ๋์ํจ์ผ๋ก ์ฃผ์ํ๋ค.
> ์ ๋ฌ๋ฐ๋ ์ปดํฌ๋ํธ์ ์๋ ์ ํ์ด ์๋ค.
|
Context.Consumer
|
> context ๋ณํ๋ฅผ ๊ตฌ๋
ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋งํ๋ค.
> ์ด ํจ์(์ปดํฌ๋ํธ)๊ฐ ๊ฐ์ง๋ context๊ฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด provider์ ๊ฐ์ด๋ค.
> ์ค์ ํ ๊ฐ์ ๋ถ๋ฌ์์ผ ํ ๋ ์ฌ์ฉํ๋ค.
> ์์ provider๊ฐ ์๋ค๋ฉด createContext()์์ ์ ์ํ defaultValue๋ฅผ ๊ฐ์ง๋ค.
|
/**
create context api
use provider to add value
use consumer to use value
*/
import React, {Component} from "react";
import {View, Text, StyleSheet, Button} from 'react-native';
// context๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ผ์ผ์ด ํตํ์ง ์๊ณ ๋
// ์ํ๋ ๊ฐ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ ๊น์ํ ๊ณณ๊น์ง ๋ณด๋ผ ์ ์์ต๋๋ค.
// ํ
๋ง context์ ๊ธฐ๋ณธ๊ฐ์ default value๋ก ๋ง๋ ๋ค.
const Context = React.createContext("default value")
export default class App extends Component{
render(){
return(
<View style={styles.container} >
// Context.Provider๋ Provider๋ฅผ ์ด์ฉํ์ฌ Context ๋ณ๊ฒฝ ์ฌํญ์ ํ์ ํธ๋ฆฌ์ ์ ๊ณตํ๋ค.
// ์๋ ์์์์๋ parent value๋ฅผ ํ์ฌ ์ ํ๋ context ๊ฐ์ผ๋ก ๋ณด๋ด๊ณ ์๋ค.
// value๊ฐ parent value์ด ๊ธฐ ๋๋ฌธ์ provider๋ฅผ ์ด์ฉํด ํ์ ํธ๋ฆฌ์ parent valueํ
๋ง ๊ฐ์ ๋ณด๋ด์ค๋ค.
<Context.Provider value={"parent value"} >
<Text style={styles.welcome}>
Context Api React-Native</Text>
<Child />
</Context.Provider>
</View>
);
}}
class Child extends Component{
render(){
return(
<View style={styles.container} >
// Context.Consumer๋ฅผ ํตํด ์ค์ ํ ๊ฐ์ ๋ถ๋ฌ์จ๋ค.
<Context.Consumer>
{value =><Text style={styles.child}>
Data is here: {value}</Text>}
</Context.Consumer>
</View>
);
}}
const styles = StyleSheet.create({
container:{
flex:1,
justifyContent:'center',
alignItems:'center',
backgroundColor:'#F5FCFF'
},
welcome:{
fontSize: 25,
textAlign: 'center',
margin:10,
},
child:{
fontSize: 18,
textAlign: 'center',
margin:10,
},
});