React Native --- 生命周期、控件、定時器、輪播圖

生命周期

大家創(chuàng)建一個新項目的時候,首先看到的就是 APP.js文件
引入頭文件.png

這個內(nèi)容是用來引用頭文件的,大家需要什么控件、功能就要引入相應(yīng)的文件,比如:需要使用一個按鈕,那么

import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View,
  Button
} from
注冊一個類.png

這部分內(nèi)容是用來聲明一個類的,

//導(dǎo)出一個App類
export default class App extends Component 
render()

這個函數(shù)是用來刷新UI,它是個異步函數(shù),因此你可以同時刷新多個render函數(shù)

屬性
state={
        title:'默認(rèn)值'
    }
//屬性
    static defaultProps={
        age:18
    }

Props屬性,相當(dāng)于OC中的readOnly,只讀屬性 嫁雞隨雞
state屬性,每一個組件有一個系統(tǒng)的setState方法,用來改變狀態(tài),而且會刷新界面,調(diào)用render函數(shù)

componentWillMount

相當(dāng)于OC中的 viewWillAppear 在組件即將顯示的時候會調(diào)用,只執(zhí)行一次

componentDidMount

刷新完了UI之后進(jìn)入 render方法調(diào)用之后 多用于網(wǎng)絡(luò)請求第一次 加載的數(shù)據(jù)

componentDidUpdate

狀態(tài)機state改變后 就進(jìn)入這個函數(shù) 更新UI后調(diào)用, 第一次加載UI的時候 不會進(jìn)入

輪播圖

輪播圖最主要的核心內(nèi)容就是:ScrollView和定時器
在RN中使用ScrollView需要導(dǎo)入ScrollView組件,只需要在import中添加就行了
定時器需要導(dǎo)入react-timer-mixin組件,這個就需要終端導(dǎo)入,首先要進(jìn)入目標(biāo)文件,然后用終端執(zhí)行npm I react-native-timer-mixin --save操作即可,使用法法如下

var React = require('react');
var TimerMixin = require('react-timer-mixin');

var Component = React.createClass({
  mixins: [TimerMixin],
  componentDidMount() {
    this.setTimeout(
      () => { console.log('I do not leak!'); },
      500
    );
  }
});
ScrollView

記住ScrollView必須有一個確定的高度才能正常工作,因為它實際上所做的就是將一系列不確定高度的子組件裝進(jìn)一個確定高度的容器(通過滾動操作)。要給一個ScrollView確定一個高度的話,要么直接給它設(shè)置高度(不建議),要么確定所有的父容器都有確定的高度。一般來說我們會給ScrollView設(shè)置flex: 1以使其自動填充父容器的空余空間,但前提條件是所有的父容器本身也設(shè)置了flex或者指定了高度,否則就會導(dǎo)致無法正常滾動,你可以使用元素查看器來查找問題的原因。
ScrollView內(nèi)部的其他響應(yīng)者尚無法阻止ScrollView本身成為響應(yīng)者。

簡易輪播圖
簡易輪播圖.gif
  • 第一步:創(chuàng)建ScrollView,加載圖片
  • 第二步:創(chuàng)建圓點區(qū)域
  • 第三步:使用定時器
  • 第四步:將scrollView和圓點聯(lián)系起來
/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View,
    ScrollView,
    Image,
    AlertIOS
} from 'react-native';

const instructions = Platform.select({
  ios: 'Press Cmd+R to reload,\n' +
    'Cmd+D or shake for dev menu',
  android: 'Double tap R on your keyboard to reload,\n' +
    'Shake or press menu button for dev menu',
});

//引入定時器
var TimerMixin = require('react-timer-mixin');
var ImageData = require('./data.json');
var Dimensions = require('Dimensions');
var {width} = Dimensions.get('window');

export default class App extends Component<{}> {
  //注冊定時器
  mixins: [TimerMixin]

  state={
    currentPage:0
  }

  //初始化固定值
  static  defaultProps={
    //間隔時間  單位是毫秒
    duration:1000
  }
  render() {
    return (
        <View style={styles.container}>
          <ScrollView ref="scrollView"
                      horizontal={true}
                      showsVerticalScrollIndicator={false}
                      showsHorizontalScrollIndicator={false}
                      pagingEnabled={true}
                      //一幀動畫結(jié)束后
                      onMomentumScrollEnd={(e)=>this.onScrollAnimationEnd(e)}
                      onScrollBeginDrag={()=>this.ScrollBeginDrag()}
                      onScrollEndDrag={()=>this.startTimer()}
          >
            {this.renderAllImage()}
          </ScrollView>
          {/*指示器*/}
          <View style={styles.pageViewStyle}>
            {/*5個小點*/}
            {this.renderPage()}
          </View>
        </View>
    );
  }

  ScrollBeginDrag(){
    //拖拽操作
    //清空定時器
    clearInterval(this.timer);
  }

  //所有UI加載完畢后調(diào)用定時器
  componentDidMount() {
    this.startTimer();
  }

  //開啟定時器的方法
  startTimer(){
    //1、拿到scrollView
    var scrollView = this.refs.scrollView;
    var imageCount = ImageData.data.length;
    var obj = this;
    //2、設(shè)置定時器
    //開啟定時器
    this.timer = setInterval(function () {//這里面this是window屬性
      //2.1設(shè)置當(dāng)前頁
      var currentPage = 0;
      //2.2判斷
      if ((obj.state.currentPage + 1) >= imageCount) {
        //清零
        currentPage =0;
      } else {
        currentPage = obj.state.currentPage + 1;
      }
      //2.3更新狀態(tài)機
      obj.setState({
        currentPage:currentPage
      })

      //2.4滾動起來
      var offsetX = currentPage * width;
      scrollView.scrollTo({x:offsetX,y:0,animation:true})


    }, this.props.duration);
  }

  onScrollAnimationEnd(e){
    //拿到偏移量
    var offsetX = e.nativeEvent.contentOffset.x;

    //2、求出第幾頁
    var currentPage = Math.floor(offsetX/width);
    //2、更新狀態(tài)機
    this.setState({
      currentPage:currentPage
    })

  }

  //返回小點點
  renderPage(){
    var style;
    //定義一個裝點點的數(shù)組
    var pageArr = [];
    //拿到圖片數(shù)組
    var imageArr = ImageData.data;

    for (var i=0; i<imageArr.length;i++){
      //判斷
      style = (i==this.state.currentPage)?{
        color:'orange'}:{
        color: '#ffffff'}
      pageArr.push(
          <Text key={i}
                style={[{fontSize:25}, style]}
          >
            &bull;  </Text>
      )
    }
    return pageArr;
  }

  renderAllImage(){
    //數(shù)組
    var allImage = [];
    //拿到圖片數(shù)據(jù)
    var imgsArr = ImageData.data;
    //遍歷數(shù)組
    for (var i=0;i<imgsArr.length;i++) {
      //取出單個圖片的對象
      var imageItem = imgsArr[i];
      //創(chuàng)建圖片組件,到數(shù)組中
      allImage.push(
          <Image key={i}
                 source={{uri:imageItem.img}}
                 style={{width: width, height:200}}
          />
      )
    }
    return allImage;
  }
}

const styles = StyleSheet.create({
  container: {
  },

  pageViewStyle:{
    width:width,
    height:25,
    backgroundColor:'rgba(0,0,0,0.4)',
    //定位
    position:'absolute',
    bottom:0,

    //主軸方向
    flexDirection:'row',
    //對齊方式
    justifyContent:'flex-end',
    //居中
    alignItems:'center'

  }
});

代碼講解

import.png

在這里引入ScrollView,Image組件,AlertIOS組件是為了有提示,方便查錯
引入文件.png

引入定時器,dataJson文件
Dimensions是用來獲取屏幕寬度的

創(chuàng)建定時器、ScrollView、小圓點.png

注冊定時器;
給定時器加個固定間隔,單位是毫秒
狀態(tài)機(state)中記錄這當(dāng)前的currentPage第幾頁
創(chuàng)建ScrollView中有個ref="scrollView",這個是給scrollView加一個標(biāo)簽,根據(jù)標(biāo)簽獲取相應(yīng)的scrollView相當(dāng)于tag

//是否水平
horizontal={true}
//是否顯示垂直方向滾動條
showsVerticalScrollIndicator={false}
//是否顯示水平方向滾動條
showsHorizontalScrollIndicator={false}
//是否分頁
pagingEnabled={true}

renderAllImage()函數(shù)是用來創(chuàng)建scrollView中的圖片,返回一個圖片數(shù)組Image使用uri獲取的時候,必須要加寬高
renderPage()函數(shù)用來創(chuàng)建小圓點,其中

style = (i==this.state.currentPage)?{
        color:'orange'}:{
        color: '#ffffff'}

是用來判斷是否是選中的頁,來使圓點變色


定時器綁定.png

綁定定時器,這里主要是 開啟定時器后,拿到scrollView的偏移量計算,
注意:在定時器中如果用this,這個是window屬性,所以使用var obj = this;難道當(dāng)前view的this

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容