機(jī)器人項(xiàng)目用ReactNative實(shí)現(xiàn),并適配iOS

使用react native實(shí)現(xiàn)機(jī)器人app。
好處:一份代碼可以分別運(yùn)行到iOS和android系統(tǒng)(有些情況需要分別處理)
具體使用的部分代碼和運(yùn)行效果(左邊為iOS):

  • 列表數(shù)據(jù)展示和下拉刷新實(shí)現(xiàn):
    • 運(yùn)行效果:


      下拉刷新.png
    • 部分代碼:
  <FlatList
    renderItem={this.renderItem}//每個(gè)item顯示的view
    data={this.props.screenProps.robotHealthList}>//數(shù)據(jù)源
    ListHeaderComponent = {this.header}
    ListFooterComponent={this.separator}
    ItemSeparatorComponent={this.separator}
    onRefresh={this.onRefresh}//刷新調(diào)用的函數(shù)
    refreshing={this.state.refreshing}//刷新?tīng)顟B(tài),用來(lái)控制刷新效果
  </FlatList>

 renderItem = ({item}) => {
    return ...//返回一個(gè)view,從item中可以拿到數(shù)據(jù)源提供的數(shù)據(jù)
    )
  }

  separator = () => {
    return ...//返回一個(gè)view
  }

  header = () => {
    return ...//返回一個(gè)view
  }

  onRefresh = () => {
    // 一般進(jìn)行網(wǎng)絡(luò)請(qǐng)求或數(shù)據(jù)庫(kù)讀取,完成后修改數(shù)據(jù)源、refreshing
  }

只要設(shè)置了onRefresh,則會(huì)在列表頭部添加一個(gè)標(biāo)準(zhǔn)的RefreshControl控件,以便實(shí)現(xiàn)下拉刷新的功能。同時(shí)需要正確設(shè)置refreshing屬性控制loading的顯示狀態(tài),一般在進(jìn)行網(wǎng)絡(luò)請(qǐng)求之前設(shè)置為true,完成請(qǐng)求時(shí)設(shè)置為false。

因?yàn)閮蓚€(gè)平臺(tái)原生的RefreshControl實(shí)現(xiàn)不同,所以同樣的代碼運(yùn)行效果不同

  • 機(jī)器人健康詳情:
    • 運(yùn)行效果:


      健康詳情.png
    • 部分代碼:
  //當(dāng)前頁(yè)面:兩個(gè)自定義控件
  //自定義控件
  <ComponentsHealthViewPager
    ...
    dataResource={this.state.robotHealthList}//數(shù)據(jù)源
    onViewPageChanged={this.onViewPageChanged}//ViewPage改變時(shí)調(diào)用
    ref={viewPager => { this.viewPager = viewPager}}/>
  //自定義控件
  <ComponentsTopologyView
    ...
    dataResource={this.state.robotHealthList}
    onComponentChanged={this.onComponentChanged}
    ref={componentsView => { this.componentsView = componentsView}}/>

  onViewPageChanged(position){
    this.componentsView.setCurrentComponent(position);
  }
  onComponentChanged(position){
    this.viewPager.setCurrentPage(position);
  }
//ComponentsHealthViewPager實(shí)現(xiàn):
  <ViewPager 
    ...
    onPageSelected={this.onPageSelected}
  </ViewPager>

  //ViewPager改變時(shí)觸發(fā)
  onPageSelected(event){
    this.props.onViewPageChanged(event.position);
  }

  //設(shè)置postion為當(dāng)前顯示頁(yè)
  setCurrentPage(postion){
    this.viewPager.setPage(postion);
  }
//ComponentsTopologyView實(shí)現(xiàn): 類似ComponentsHealthViewPager
  • 機(jī)器人分布頁(yè)面:react native可以和原生混編,這個(gè)頁(yè)面由于與用戶的交互比較多(手勢(shì)操作),相對(duì)比較復(fù)雜,所以是采用分別調(diào)用原生控件的方式實(shí)現(xiàn)的
    • 運(yùn)行效果:


      機(jī)器人分布.png
    • 部分代碼:
//TopologyView.js
import { requireNativeComponent, View } from 'react-native';
module.exports = requireNativeComponent('TopologyView', null);
//原生view寫好之后按一定規(guī)則暴露出來(lái),ReactNative就可以請(qǐng)求調(diào)用了
//如果iOS和android暴露的名字保持一致(比如'TopologyView'),調(diào)用時(shí)就可以統(tǒng)一處理
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評(píng)論 25 708
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,110評(píng)論 8 183
  • 今天,一位80多歲的老爺爺入土為安,作為親戚的我們?nèi)ニ屠先俗詈笠怀?。我們這邊有風(fēng)俗,人不在了要請(qǐng)人把去世的...
    dingjinyan2468閱讀 239評(píng)論 0 0
  • 我是農(nóng)村孩子,爺爺奶奶的純樸及鄉(xiāng)里鄰居們的熱情使我從小就喜歡自己身處的環(huán)境。 我沒(méi)聽(tīng)爺爺奶奶說(shuō)過(guò)他們之間的愛(ài)情,只...
    暖果林閱讀 517評(píng)論 2 3
  • 沒(méi)有掌聲 舞臺(tái)就在那里靜靜地端坐著 劇場(chǎng)前方的窗子 久久地望著遠(yuǎn)方的海 從前,故事 湮沒(méi)于礁石間的浪 拾起一張?jiān)缫?..
    野鶴無(wú)糧閱讀 373評(píng)論 2 6