學習 React.js:用 ReactJS 30 分鐘打造一個移動應用
Make a Mobile App with ReactJS in 30 Minutes Ken Wheeler (@ken_wheeler) React 能讓前端開發者以前所未有的方式來構建應用。它有許多好處:比如單向數據流,簡單的組件生命週期,聲明組件之類的。 Reapp 是最近發佈的基於 React 的一個框架。它是一個專為性能和生產效率而生的移動應用平台。你可以把它看做是一個精心優化過的 UI 組件,並且帶有一套很好的編譯系統,以及許多有用工具,能讓你輕松構建你的應用。 Reapp 給我們提供了一堆很棒的東西:
#我們的目標 為了演示 Reapp,我們將創建一個應用,可以讓你檢索 Flickr API,然後把結果在圖片庫裏面顯示出來。跟著這個教程做的話,大約也就會佔用你不到半個小時的時間! #開始 首先你得安裝有 node,然後我們來執行 你就會看到如下: 在你的瀏覽器中打開 localhost:3010,你就會看到默認的 Reapp 應用啦: 小提示:在 Chrome 的開發者工具裏面,可以打開模擬移動設備,以移動應用的方式來查看你的應用。 棒!現在我們已經完全跑起來一個用 Reapp 組件創建的全 React 棧應用。來看看文件結構: <!-- lang: js --> /app components/ home/ Sub.jsx App.jsx Home.jsx app.js routes.js /assets Reapp 給我們搭建了一些演示的頁面,正如你看到的,放在 ##從視圖開始 我們生成一個應用,不過 Reapp 生成的應用包括了許多內嵌頁面,我們不需要那麽多,只要單頁就好。讓我們先把它弄簡單點。在 <!-- lang: js --> module.exports = ({ routes,route }) => routes(require,route('app','/',{ dir: '' }) ); 這樣指定了根路由 (http://localhost:3010) 到 現在我們可以放心的把 在 <!-- lang: js --> import React from 'react'; import View from 'reapp-ui/views/View'; export default React.createClass({ render() { var { photos } = this.state; return ( <View title="Flickr Search" styles={{ inner: { padding: 20 } }}> <p>Hello World</p> </View> ); } }); 如果你刷新一下,你就可以看到界面變成了一個空的視圖加上頂部的一條新標題"Flickr Search"。 ##從 Flickr 拿數據 現在我們有了界面但是沒邏輯。在我們把按鈕和顯示照片連動起來之前,當然要用 React 方式先從 Flickr 拿到照片數據。首先,你得有個 Flickr 帳號,和 API key。沒有?點這裏。 填好它(沒有帳號你就先註冊),把它們給你的 Public Key 拷貝到 看起來文件就是這樣: <!-- lang: js --> const key = '__YOUR_KEY_HERE__'; const base = 'https://api.flickr.com/services/rest/?api_key=${key}&format=rest&format=json&nojsoncallback=1'; 那個 "YOUR_KEY_HERE" 是給你放 key 的地方。 注意: 下面,給我們的 React 類定義 <!-- lang: js --> getInitialState() { return { photos: [] } }, 這樣我們就可以在渲染方法裏面,訪問 <!-- lang: js --> import Button from 'reapp-ui/components/Button'; import Input from 'reapp-ui/components/Input'; 然後更新 <!-- lang: js --> render() { var { photos } = this.state; return ( <View title="Flickr Search"> <Input ref="search img-responsive" /> <Button onTap={this.handleSearch}>Search Images</Button> <div className="verticalCenter"> {!photos.length && <p>No photos!</p> } </div> </View> ); } 然後你接滿就變成這樣: 簡單到爆!不過還是有一些需要值得注意的地方。首先,看到輸入框的 ref 屬性 沒有?Ref 是 reference 的縮寫,用來讓我們來在 class 中跟蹤 DOM 元素的。我們之後會用它來拿界面上輸入的值。 還有,請看 div 上的 最後,看到按鈕上的 <!-- lang: js --> import Superagent from 'superagent'; 然後定義 handleSearch: <!-- lang: js --> handleSearch() { let searchText = this.refs.search.getDOMNode().value; Superagent .get(`${base}&method=flickr.photos.search&text=${searchText}&per_page=10&page=1`,res => { if (res.status === 200 && res.body.photos) this.setState({ photos: res.body.photos.photo }); }); }, 幾個新的注意點:
##顯示 Flickr 照片 現在我們拿到了 Flickr 照片,把它們放到了 state 中。最後一步是顯示了。你可以加一句 console.log 到 render 方法第一行看看 Flick 給你返回了什麼: <!-- lang: js --> render() { console.log(this.state.photos); // ... rest of render } 在控制檯你會看到 Flickr 給你返回了一個對象,裏面有許多屬性,這些屬性取決於你的請求 URL。你可以在這個幫助頁面看看應該怎樣處理 flickr 的 URL。 你看我是這樣來處理我的 URL 的,我放了一個簡單的方法在類裏面: <!-- lang: js --> getFlickrPhotoUrl(image) { return `https://farm${image.farm}.staticflickr.com/${image.server}/${image.id}_${image.secret}.jpg`; }, 這個方法拿到我們的 Flickr 對象,把它轉化成我們需要顯示的 URL 。下面,我們來編輯 handleSearch, <!-- lang: js --> this.setState({ photos: res.body.photos.photo.map(this.getFlickrPhotoUrl) });
我們把 reapp 的 Gallery 組件到進來: <!-- lang: js --> import Gallery from 'reapp-ui/components/Gallery'; 在 render 方法裏面, 在 <!-- lang: js --> {!!photos.length && <Gallery images={photos} width={window.innerWidth} height={window.innerHeight - 44} /> } Gallery 組件會把這三個屬性拿到,然後全屏模式顯示圖片,你可以左右滑動切換它們。到這裏,我們已經完成我們的應用啦。在你的瀏覽器來看看它是怎樣咦鞯陌伞 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |