React-Native

React-Native Fetch(API 연동)

김태웜 2021. 2. 3. 16:10

안드로이드는 보통 데이터 베이스 연결할때 직접연결하기보다 API 이용해서 데이터값을 주고받는다

 

Second.js

import React, {Component} from 'react';
import {StyleSheet,View, Text,TextInput, TouchableOpacity, Alert,Modal,TouchableHighlight} from 'react-native';
import { ScrollView } from 'react-native-gesture-handler';

class Second extends Component {
    state={
        count:0,
        value:'',
        text:'',
        size:15,
      };
    render() {
        return (
            <View style={{flex:1}}>
                <View style={{width:'100%', height:'10%', alignItems: 'center'}}>{/*justifyContent는 세로로가운데정렬 */}
                    <View style={{flexDirection:'row'}}>
                        <View style={{marginTop:15,marginRight:10}}>
                            <Text>ㅅㄱ</Text>
                        </View>
                        <View>
                            <TextInput style={styles.input} onChangeText={(text) => this.setState({value:text})}/>
                        </View>
                        <TouchableOpacity onPress={this.fetchData.bind(this)}>
                        <View style={{width:50,height:50,alignItems:'center',justifyContent:'center',marginLeft:10,backgroundColor:'red'}}>
                                <Text>검색</Text>
                        </View>
                        </TouchableOpacity>
                        <TouchableOpacity onPress={this.fontsizeP.bind(this)}>
                        <View style={{width:50,height:50,alignItems:'center',justifyContent:'center',marginLeft:10,backgroundColor:'#202856'}}>
                                <Text style={{color:'white'}}>+</Text>
                        </View>
                        </TouchableOpacity>
                        <TouchableOpacity onPress={()=>{this.fontsizeM.bind(this);}}>
                        <View style={{width:50,height:50,alignItems:'center',justifyContent:'center',marginLeft:10,backgroundColor:'#202856'}}>
                                <Text style={{color:'white'}}>-</Text>
                        </View>
                        </TouchableOpacity>
                    </View>
                </View>
                <View style={{width:'100%',height:'90%'}}>
                    <ScrollView>
                        <Text style={{fontSize:this.state.size}}>{this.state.text}</Text>
                    </ScrollView>
                </View>
            </View>
        );
    }

    printbible = function(){
        let bible = this.state.value;
        this.setState({text:bible});
    }
    search = function(){
        let inpp = this.state.value;
        Alert.alert('오류',inpp+"장은 없습니다.");
    }

    fontsizeP = function(){
        if(this.state.size == 25){
            Alert.alert('오류','더이상 글자를 늘릴 수 없습니다.');
        }else{
            this.state.size += 1;
            this.setState({size:this.state.size});
        }
        
    }

    fontsizeM = function(){
        if(this.state.size == 10){
            Alert.alert('오류','더이상 글자를 줄일 수 없습니다.');
        }else{
            this.state.size -= 1;
        this.setState({size:this.state.size});
        }
    }

    fetchData=()=>{
        var request = new XMLHttpRequest();
        request.onreadystatechange = (e) =>{
          if(request.readyState !== 4){
            return;
          }
          if(request.status ===200){
            console.log('success',request.responseText);
            //여기서 값 옮겨서 화면단에다가 출력할수있는방안찾기
            this.setState({
              text: request.responseText
            })
          }else{
            console.warn('error');
          }
        };
        request.open('GET','API URL 주소');
        request.send();
    }
}
export default Second;

const styles = StyleSheet.create({
    input:{
        width:200,
        borderColor:"#000000",
        borderWidth: 1
    }
});

검색 버튼을 누르면 fetchData 함수가 실행되고 API URL 주소에 나온 데이터값을 가져온다

request.status 가 200 이면 정상적으로 연결이 됐다는 뜻이고

state.text에 값을 넣어준다 값은 (request.responseText)

그리고 this.setState가 실행됐으니까 다시 render가 실행됨으로써 Text에 {this.state.text}에 값이 들어간 상태로 출력된다

 

ps. fontsizeP, fontsizeM은 글자수 줄이고 늘리는 함수임 되게 간단하게 만들어놓음

 

모르는거 있을때 공식문서 참조

 

'React-Native' 카테고리의 다른 글

React-Native 함수, 변수 사용  (0) 2021.02.02
React-Native 화면전환 최종  (0) 2021.01.29
React-Native 화면이동3  (0) 2021.01.28
React-Native 화면전환2  (0) 2021.01.26
React-Native CSS  (0) 2021.01.13