1. 程式人生 > 實用技巧 >React使用百度地鐵API

React使用百度地鐵API

最近在做一個北京地鐵費用查詢系統的Web,前端使用的是React。

後來查詢到百度地圖和高德地圖都有實現好的地鐵圖API,可以直接使用(最後選擇了百度,因為官方文件詳細很多)。但是官方教程都是直接插入到一個原生HTML中。而我們都知道React使用JSX將元素渲染為DOM,主要問題就在於我在index.html中匯入了百度地圖的script,要怎麼在React元件中使用。

以下解決方案以百度地圖為例,適用於其他沒有module的CDN方案,如果有更好的方法歡迎在評論區提出。

如果我們直接在index.html中,貼上了script,然後在React元件中使用,會出現報錯

'BmapSub' is not defined

說明React元件沒有獲取到對應的類和方法。

第一步,在你的index.html中,匯入百度地鐵的script。

<!-- index.html -->
<script type="text/javascript" src="https://api.map.baidu.com/api?type=subway&v=1.0&ak=您的金鑰"></script>

第二步,用window這個全域性變數來儲存需要用到的類。

所有瀏覽器都支援 window 物件。它表示瀏覽器視窗。

所有 JavaScript 全域性物件、函式以及變數均自動成為 window 物件的成員。

全域性變數是 window 物件的屬性,全域性函式是 window 物件的方法。

所以我們在window中儲存我們需要用到的類和方法。這裡就儲存BMapSubway

<!-- index.html -->
<script type="text/javascript" src="https://api.map.baidu.com/api?type=subway&v=1.0&ak=您的金鑰"></script>
<script>
	window.BMapSubway = BMapSubway;	// 這裡可以訪問到BmapSubway這個類,所以直接設為全域性類
</script>

第三步,愉快地在React元件中使用。

// Map.js
import React from 'react';

class Map extends React.Component {
    createSubway (){
        let BMapSub = window.BMapSub;		// 關鍵,取全部變數為區域性變數,然後使用
        var subwayCityName = '北京';
        var list = BMapSub.SubwayCitiesList;
        var subwaycity = null;
        for (var i = 0; i < list.length; i++) {
            if (list[i].name === subwayCityName) {
                subwaycity = list[i];
                break;
            }
        }
        var subway = new BMapSub.Subway('map', subwaycity.citycode);
        subway.setZoom(1);
    }

    componentDidMount() {
        this.createSubway();
    }

    render() {
        return (
            <div id="map">
            </div>
        );
    }
}

export default Map;

多說一句,這裡插入一下componentDidMount()的使用。上面使用了componentDidMount(),是因為我要把地鐵圖插入到我將要渲染的<div id="map"></div>中,也就是我必須得等該div渲染完畢,我的程式碼才能獲取到。(在原生HTML中,我們通過更改程式碼順序就可以簡單地實現)

componentDidMount()會在元件掛載後(插入 DOM 樹中)立即呼叫。依賴於 DOM 節點的初始化應該放在這裡。如需通過網路請求獲取資料,此處是例項化請求的好地方。

所以,我把地圖初始化放在了componentDidMount()中,這樣當頁面渲染完畢,我就可以獲取到<div id="map"></div>併成功插入地圖。