Burger Map: React로 데이터 가져오기 및 표시하기

22117 단어 reactapimapboxtutorial
웹 개발을 배우는 것은 매우 지루하고 회색일 수 있습니다. 따라서 학습 과정에 좋아하는 것을 포함시키는 것이 좋습니다.
Ania Kubów는 YouTube 동영상How to mock your own API에서 Burger API를 만들었습니다.

나는 자유를 얻었고 그 API를 사용하여 React로 Burger Map을 만들었습니다. 그리고 여기에서 방법을 보여줍니다.

만약 질문이 있다면

TL;DR

콘텐츠 목록


  • Create React App
  • Fetching Burger Data
  • Mapbox API
  • Append Latitude and Longitude Values to the Response
  • Display the World Map
  • Render Data on the Map

  • React 앱 만들기

    Let's setup our frontend application by typing the following command into your terminal:

    npx create-react-app burger-map
    

    This command will boilerplate a complete react application for you.

    Jump into your project with cd burger-map and then start the development server with yarn start ,

    This will start the react application which you can then visit at http://localhost:3000 .

    Once this is done we can open up this project in the editor of our choice.

    In the main file App.js safely remove all the stuff which is not needed the file will look like this:

    import './App.css';
    
    function App() {
        return (
            <div className="App">
    
            </div>
        );
    }
    
    export default App;
    

    버거 데이터 가져오기

    The next step is to fetch the data which we want to display. For that purpose we are going to use the npm module axios which will execute our HTTP requests.

    Install it with yarn via the terminal:

    yarn add axios
    

    To add a state to our application, we need to import the useState hook. Since we want to call up the data right at the beginning of our application, we need the useEffect hook right away.
    Import them at the beginning of App.js

    import {useState, useEffect} from 'react';
    

    We need one state to set our application into the loading state while fetching data, and one to store the burger data.
    Lets to this with this to lines of code:

    const [loading, setLoading] = useState(true)
    const [burgers, setBurgers] = useState(null)
    

    The function to fetch the data we place the useEffect hook, to be sure it is called right at the beginning of our application.
    As mentiond we use axios to handle the get-request.
    The URL of the API is where we get the burgers from is https://my-burger-api.herokuapp.com/burgers .

    The useEffect hook should now look like this:

    useEffect(() => {
        const fetchBurgers = async () => {
    
            const {data} = await axios.get("https://my-burger-api.herokuapp.com/burgers")
    
            setBurgers(data)
            setLoading(false)
        }
    
        fetchBurgers()
    }, []);
    

    맵박스 API

    For further purposes we need to create an free account at mapbox.com . 그런 다음 계정 아래에서 Mapbox Api를 호출하는 데 필요한 액세스 토큰을 만들 수 있습니다.
    이 토큰을 복사하여 애플리케이션의 caconst에 넣으십시오.

    const MAPBOX_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    


    응답에 위도 및 경도 값 추가

    When we check the response for e.g. with console.log(data)
    we see that currently the address for each burger looks something like that:

    [
        {
        addressId: 0
            country: "United Kingdom"
            line1: "Brick Lane"
            line2: "Shoreditch"
            number: "104"
            postcode: "E1 6RL"
        },
        ...
    ]
    

    Since the Mapbox App is needing the latitude and longitude values to display the data on the correct position we have to call the geocoding endpoint. Here we have to pass the address object as a string seperated with ampersands.

    For that case create the getLatLong function like that:

    const getLatLong = async (address) => {
        const {line1, line2, number, postcode, country} = address;
        let searchKey = [line1, line2, number, postcode, country].filter(Boolean).join().replaceAll(" ", "&");
    
        const {data: {features}} = await axios.get(`https://api.mapbox.com/geocoding/v5/mapbox.places/${searchKey}.json?access_token=${MAPBOX_TOKEN}`)
    
        return features[0].center;
    }
    

    Now we need to call this function for each burger so adjust the fetchBurgers function to look like that:

    useEffect(() => {
        const fetchBurgers = async () => {
            let burgers = []
            const {data} = await axios.get("https://my-burger-api.herokuapp.com/burgers")
    
            for (const burger of data) {
                burger.latLong = await getLatLong(burger.addresses[0])
                burgers.push(burger)
            }
    
            setBurgers(burgers)
            setLoading(false)
        }
    
        fetchBurgers()
    }, []);
    

    Now when we check our burger object we see a property latLong which is an array containing the lat and long values.

    세계 지도 표시

    To display the data on a map let's install the ReactMapGL 구성 요소.

    yarn add react-map-gl
    


    그런 다음 앱 시작 부분에서 지도와 마커 구성 요소를 가져옵니다.

    import ReactMapGL, {Marker} from 'react-map-gl';
    


    App.js에서 반환을 조정하고 다음과 같이 Map Component를 추가해 보겠습니다.

    
    if (loading) {
        return 'loading burgers..'
    }
    
    return (
        <div className="App">
            <div>
                <h1 style={{textAlign: 'center'}}>World Map</h1>
            </div>
    
            <ReactMapGL
                width="100vw"
                height="100vh"
                mapboxApiAccessToken={MAPBOX_TOKEN}
            >
            </ReactMapGL>
        </div>
    );
    


    이제 브라우저에서 이미 전체 화면 지도를 볼 수 있습니다.

    지도를 대화형으로 만들려면 뷰포트와 이를 변경하는 기능을 추가해야 합니다.

    따라서 새 상태를 추가하고 맵 구성요소를 조정합니다.

    const [vieport, setVieport] = useState({})
    



    <ReactMapGL
        {...vieport}
        width="100vw"
        height="100vh"
        onViewportChange={nextVieport => setVieport(nextVieport)}            
        mapboxApiAccessToken={MAPBOX_TOKEN}
    >
    </ReactMapGL>
    


    가서 지도를 확인하세요. 이제 드래그 앤 드롭은 물론 확대 및 축소가 가능합니다.

    지도에서 데이터 렌더링

    Now we come to the last part. We have to combine the data and the map.

    For that create the renderBurgers function and call inside of the ReactMapGL component.
    The renderBurgers function maps over all burgers, passes the lat and long values to the Marker and returns them on their location.
    Whatever you pass inside the Marker Component will then be displayed on the map. In this case we render a X for each burger.

    function renderBurgers() {
        return burgers.map(burger => (
            <Marker
                key={burger.id}
                latitude={burger.latLong[1]}
                longitude={burger.latLong[0]}
            >
                X
            </Marker>
        ))
    }
    

    The last step is to call the renderBurgers function in the ReactMapGl Component. So let's add it:

    <ReactMapGL
        {...vieport}
        width="100vw"
        height="100vh"
        onViewportChange={nextVieport => setVieport(nextVieport)}
        mapboxApiAccessToken={MAPBOX_TOKEN}
    >
        {renderBurgers()}
    </ReactMapGL>
    

    결론



    여기에서 반응 앱을 만들고 API에서 데이터를 가져오는 방법을 보여주었습니다. 그런 다음 Mapbox 반응 구성 요소를 사용하여 데이터를 지도에 표시했습니다.

    이것은 나의 첫 번째 기사였습니다. 당신이 그것을 좋아한다면 지금 저에게 허락하십시오. 그리고 마음에 들지 않는다면 지금 개선할 점을 알려주세요.

    읽어 주셔서 감사합니다!



    GitHub: https://github.com/dom-the-dev/burger-map

    TL;DR

    I also made a step by step video for this burger map on my .

    좋은 웹페이지 즐겨찾기