初識(shí)ReactNative

開發(fā)環(huán)境配置
頁面渲染
  • 組件的渲染需要在自定義 class 中進(jìn)行,每個(gè)自定義視圖class中都包含一個(gè)render()方法,我們需要給render()方法返回一個(gè)自定義組件,由其進(jìn)行將組件渲染:
class MyView extends Component {
    render(){
        return(
            <ScrollView>
                <Text >這里顯示文字</Text>
            </ScrollView>
        );
    }
}
實(shí)現(xiàn)一個(gè)ListView以及下拉刷新
  • 代碼如下:
 class HomeView extends Component {
    constructor(props){
        super(props);
        this.state = {
            dataSource:new ListView.DataSource({rowHasChanged: (row1, row2) => row1 !== row2}),
            loaded:false,
            dataArray:new Array(),
            date:0,
            isRefreshing:false,
        }
    }

    //渲染組件
    render() {
        return(
            <ListView
                style={{flex:1}}
                dataSource={this.state.dataSource}
                renderRow={model=>this.renderRow(model)}
                onEndReached={() => this.fetchData(this.state.date)}
                enableEmptySections={true}
                refreshControl={
                    <RefreshControl
                        refreshing={this.state.isRefreshing}
                        onRefresh={() => this.refreshData()}
                    />
                }
            />
        );
    }

    //組件加載完畢,請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)
     componentDidMount() {
        this.fetchData(0);
     }
     //開啟網(wǎng)絡(luò)請(qǐng)求
    fetchData(date) {
        var url;
        if (date === 0) {
            url = "http://news-at.zhihu.com/api/4/news/latest";
        }else{
            url = "http://news-at.zhihu.com/api/4/news/before/" + date;
        }
        fetch(url)
            .then((responseData) => responseData.json())
            .then((jsonString) => {
                this.setState({
                    dataArray:this.state.dataArray.concat(jsonString.stories),
                    dataSource:this.state.dataSource.cloneWithRows(this.state.dataArray),
                    date:jsonString.date,
                    loaded:true,
                    isRefreshing:false,
                })
            })
            .done()
    }
    //下拉刷新數(shù)據(jù)
     refreshData() {
        this.state = {
            date:0,
            dataArray:new Array(),
            isRefreshing:true,
            loaded:false,
            dataSource:new ListView.DataSource({rowHasChanged: (row1, row2) => row1 !== row2}),
        };
        this.fetchData(0);
     }
    //返回ListView 的cell
    renderRow(model){
        return(
            <TouchableOpacity style={styles.container} onPress={() => this.didSelectedRow(model)}>
                <Image source={{uri:model.images[0]}} style={styles.imageStyle}/>
                <Text style={styles.titleStyle}>{model.title}</Text>
            </TouchableOpacity>
        );
    }
    //ListView選中某一行之后
     didSelectedRow(model){
        this.props.navigator.push({
            title:model.title,
            component:HomeDetailView,
            passProps:{'newsID':model.id},
        })
    } 
    }
  • 創(chuàng)建樣式
var styles = StyleSheet.create ({
    container:{
        flex:1,
        padding:8,
        height:80,
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'flex-start',
        borderBottomColor:'gray',
        borderBottomWidth:0.4,
    },
    imageStyle:{
        width:100,
        height:70,
    },
    titleStyle:{
        margin:6,
        flex:1,
        fontSize:15,
    }
})
  • 視圖渲染之前會(huì)先執(zhí)行class的構(gòu)造方法,在構(gòu)造方法內(nèi)初始化state參數(shù),為ListView指定dataSource,并指定ListView的刷新狀態(tài)為false,代碼:
onstructor(props){
      super(props);
      this.state = {
          dataSource:new ListView.DataSource({rowHasChanged: (row1, row2) => row1 !== row2}),//指定當(dāng)數(shù)據(jù)不同時(shí)才刷新ListView
          loaded:false,
          dataArray:new Array(), //存儲(chǔ)數(shù)據(jù)model的數(shù)組
          date:0,
          isRefreshing:false,  //ListView下拉刷新初始狀態(tài)
      }
  • 視圖渲染會(huì)調(diào)用render()方法,將ListView生成
render() {
      return(
          <ListView
              style={{flex:1}}
              dataSource={this.state.dataSource}
              renderRow={model=>this.renderRow(model)}
              onEndReached={() => this.fetchData(this.state.date)}
              enableEmptySections={true}
              refreshControl={
                  <RefreshControl    //ListView的下拉刷新控件
                      refreshing={this.state.isRefreshing} 
                      onRefresh={() => this.refreshData()} //刷新時(shí)調(diào)用的方法
                  />
              }
          />
      );
  }
  • 組件已經(jīng)加載完成后會(huì)調(diào)用componentDidMount ()函數(shù),在此方法內(nèi)執(zhí)行網(wǎng)絡(luò)請(qǐng)求:
   componentDidMount() {
      this.fetchData(0);
   }
   //網(wǎng)絡(luò)請(qǐng)求
  fetchData(date) {
      var url;
      if (date === 0) {
          url = "http://news-at.zhihu.com/api/4/news/latest";
      }else{
          url = "http://news-at.zhihu.com/api/4/news/before/" + date;
      }
      fetch(url)
          .then((responseData) => responseData.json())
          .then((jsonString) => {
              this.setState({
                  dataArray:this.state.dataArray.concat(jsonString.stories),//將json解析之后的數(shù)據(jù)數(shù)組交給dataArray
                  dataSource:this.state.dataSource.cloneWithRows(this.state.dataArray),根據(jù)dataArray中的數(shù)據(jù)生成ListView的dataSource
                  date:jsonString.date,
                  loaded:true,
                  isRefreshing:false,//將刷新狀態(tài)置為false
              })
          })
          .done()
  }
  • 組件生命周期
    1. componentWillMount () 這個(gè)函數(shù)調(diào)用時(shí)機(jī)是在組件創(chuàng)建荡陷,并初始化了狀態(tài)之后镐作,在第一次繪制 render() 之前“獬椋可以在這里做一些業(yè)務(wù)初始化操作崔赌,也可以設(shè)置組件狀態(tài)涵紊。這個(gè)函數(shù)在整個(gè)生命周期中只被調(diào)用一次
  1. componentDidMount () 在組件第一次繪制完成的回調(diào)函數(shù)哈街,通知組件已經(jīng)加載完成
  2. componentWillReceiveProps() 組件的props或state進(jìn)行了修改,組件收到新的屬性
  3. shouldComponentUpdate() 是否更新組件,可以返回false或true來控制是否進(jìn)行渲染
  4. componentWillUpdate()組件將要刷新
  5. componentDidUpdate()組件已經(jīng)完成更新
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揣苏,一起剝皮案震驚了整個(gè)濱河市悯嗓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸察,老刑警劉巖脯厨,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蛾派,居然都是意外死亡俄认,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門洪乍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眯杏,“玉大人,你說我怎么就攤上這事壳澳∑穹罚” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵巷波,是天一觀的道長(zhǎng)萎津。 經(jīng)常有香客問我,道長(zhǎng)抹镊,這世上最難降的妖魔是什么锉屈? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮垮耳,結(jié)果婚禮上颈渊,老公的妹妹穿的比我還像新娘遂黍。我一直安慰自己,他們只是感情好俊嗽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布雾家。 她就那樣靜靜地躺著,像睡著了一般绍豁。 火紅的嫁衣襯著肌膚如雪芯咧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天竹揍,我揣著相機(jī)與錄音敬飒,去河邊找鬼。 笑死芬位,一個(gè)胖子當(dāng)著我的面吹牛驶拱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晶衷,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蓝纲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了晌纫?” 一聲冷哼從身側(cè)響起税迷,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锹漱,沒想到半個(gè)月后箭养,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哥牍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年毕泌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅辣。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撼泛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澡谭,到底是詐尸還是另有隱情愿题,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布蛙奖,位于F島的核電站潘酗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雁仲。R本人自食惡果不足惜仔夺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攒砖。 院中可真熱鬧缸兔,春花似錦骆膝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掐暮。三九已至蝎抽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間路克,已是汗流浹背樟结。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留精算,地道東北人瓢宦。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灰羽,于是被迫代替她去往敵國和親驮履。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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

  • 公司打算用react-native開發(fā)APP廉嚼,初始RN遇到了很多坑玫镐,搭建了一個(gè)小的項(xiàng)目框架,結(jié)合redux根據(jù)公司...
    45b645c5912e閱讀 724評(píng)論 0 5
  • 本人小白怠噪,也是最近才開始學(xué)習(xí)ReactNative,只是想記錄自己的學(xué)習(xí)歷程恐似,供日后查閱復(fù)習(xí),文中有任何錯(cuò)誤或者不...
    小唐羽鋒閱讀 1,351評(píng)論 0 51
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理傍念,服務(wù)發(fā)現(xiàn)矫夷,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 第一次聽到人生關(guān)鍵詞是在古典老師的MVP 課程上憋槐,老師讓畫出自己的價(jià)值觀羅盤双藕,我看到那么多關(guān)鍵詞,第一感覺是想我自...
    tianshixiawucha閱讀 1,071評(píng)論 0 0