React Native封裝Toast與加載Loading組件

React Native開發(fā)封裝Toast與加載Loading組件

在App開發(fā)中愚战,我們避免不了使用的兩個組件芒篷,一個Toast,一個網(wǎng)絡加載Loading孟岛,在RN開發(fā)中瓶竭,也是一樣,React Native官方并沒有提供者這兩個常用組件渠羞,需要開發(fā)者自己根據(jù)需求來自定義斤贰。作者就在其他組件的基礎上在進行二次封裝,使用起來更加簡單次询,更具擴展性荧恍,同學們只需將Toast與Loading文件拖到項目中,install對應的組件庫即可

效果圖

gif

Toast和Loading Demo地址

https://github.com/guangqiang-liu/react-native-toastAndLoading

Demo使用使用到的三方組件

  • react-native-root-toast:用來顯示toast
  • react-native-root-siblings:用來Loading在App最上層添加視圖
  • react-native-vector-icons:IconFont

注意

react-native-vector-icons 需要link 才能使用,同學們需要注意

Toast組件

toast組件這里作者分類8種不同的使用場景送巡,目前能想到的就這多場景了摹菠,后面同學們有其他場景,可以自行添加即可骗爆,Toast組件中使用到的Icon圖標次氨,同學們也可以自行修改

  • 只顯示最簡單的文本的toast
  • 只顯示最簡單的文本的長toast,顯示時長 + 500毫秒
  • 顯示success的toast摘投,success的Toast帶有一個成功的對號icon
  • 顯示success的toast煮寡,支持回調(diào),使用場景類似于登錄成功犀呼,顯示1500毫秒toast幸撕,然后在回調(diào)函數(shù)中跳轉到其他頁面
  • 顯示success的長toast,顯示時長 + 500毫秒
  • 顯示success的長toast外臂,顯示時長 + 500毫秒坐儿,支持回調(diào),使用場景類似于登錄成功宋光,顯示1000毫秒toast貌矿,然后跳轉到其他頁面
  • 顯示warning的toast,使用場景類似于登錄表單跃须,手機號填寫錯誤
  • 顯示報錯的toast站叼,使用場景類似于登錄表單娃兽,提交表單失敗

Loading組件

Loading組件最常用的使用場景就是網(wǎng)絡請求時菇民,數(shù)據(jù)還沒有請求回來之前,頁面最上層顯示一個正在加載的loading框投储,一來能夠防止用戶在網(wǎng)絡請求時又做其他的操作第练,二來可以給用戶一個更好的體驗,不至于頁面空白玛荞,顯得突兀

  • loading支持手動調(diào)用顯示:show()
  • 支持手動關閉顯示:hidden()

這里作者建議使用redux來控制Loading的顯示與隱藏娇掏,這樣不用在每一個需要網(wǎng)絡請求的頁面都手動去調(diào)用顯示與隱藏,更高端的Loading使用技巧可以參照作者的React Native開發(fā)項目:OneM

Toast核心源碼

const Toast = {

  toast: null,

  show: msg => {
    this.toast = RootToast.show(msg, {
      position: 0,
      duration: 1500
    })
  },

  showLong: msg => {
    this.toast = RootToast.show(msg, {
      position: 0,
      duration: 2000
    })
  },

  showSuccess: (msg, options) => {
    let toast = RootToast.show(
      Platform.OS === 'ios' ?
        <View style={styles.container}>
          <Icon name='check' size={50} color={'#fff'}/>
          <Text style={styles.message}>{msg}</Text>
        </View> : msg, {
        duration: 1500,
        position: RootToast.positions.CENTER,
        ...options,
      })
    setTimeout(function () {
      RootToast.hide(toast)
      typeof options === 'function' ? options && options(): null
    }, 2000)
  },

  showLongSuccess: (msg, options) => {
    let toast = RootToast.show(
      Platform.OS === 'ios' ?
        <View style={styles.container}>
          <Icon name='check' size={50} color={'#fff'}/>
          <Text style={styles.message}>{msg}</Text>
        </View> : msg, {
        duration: 2000,
        position: RootToast.positions.CENTER,
        ...options,
      })
    setTimeout(function () {
      RootToast.hide(toast)
      typeof options === 'function' ? options && options(): null
    }, 2500)
  },

  showWarning: (msg, options) => {
    let toast = RootToast.show(
      Platform.OS === 'ios' ?
        <View style={styles.container}>
          <Icon name='warning' size={40} color={'#fff'}/>
          <Text style={styles.message}>{msg}</Text>
        </View> : msg, {
        duration: RootToast.durations.SHORT,
        position: RootToast.positions.CENTER,
        ...options,
      })
    setTimeout(function () {
      RootToast.hide(toast)
    }, RootToast.durations.SHORT + 500)
  },

  showError: (msg, options) => {
    let toast = RootToast.show(
      Platform.OS === 'ios' ?
        <View style={styles.container}>
          <Icon name='close' size={40} color={'#fff'}/>
          <Text style={styles.message}>{msg}</Text>
        </View> : msg, {
        duration: RootToast.durations.SHORT,
        position: RootToast.positions.CENTER,
        ...options,
      })
    setTimeout(function () {
      RootToast.hide(toast)
    }, RootToast.durations.SHORT + 500)
  }

}

Loading核心源碼

const HUD = {

  show: () => {
    sibling = new RootSiblings(
      <View style={styles.maskStyle}>
        <View style={styles.backViewStyle}>
          <ActivityIndicator size="large" color="white" />
        </View>
      </View>
    )
  },

  hidden: ()=> {
    if (sibling instanceof RootSiblings) {
      sibling.destroy()
    }
  }

}

更多文章

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婴梧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子客蹋,更是在濱河造成了極大的恐慌塞蹭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讶坯,死亡現(xiàn)場離奇詭異番电,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門漱办,熙熙樓的掌柜王于貴愁眉苦臉地迎上來这刷,“玉大人,你說我怎么就攤上這事娩井∠疚荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵洞辣,是天一觀的道長率碾。 經(jīng)常有香客問我,道長屋彪,這世上最難降的妖魔是什么所宰? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮畜挥,結果婚禮上仔粥,老公的妹妹穿的比我還像新娘。我一直安慰自己蟹但,他們只是感情好躯泰,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著华糖,像睡著了一般麦向。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上客叉,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天诵竭,我揣著相機與錄音,去河邊找鬼兼搏。 笑死卵慰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的佛呻。 我是一名探鬼主播裳朋,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吓著!你這毒婦竟也來了鲤嫡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绑莺,失蹤者是張志新(化名)和其女友劉穎暖眼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體紊撕,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡罢荡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片区赵。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惭缰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笼才,到底是詐尸還是另有隱情漱受,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布骡送,位于F島的核電站昂羡,受9級特大地震影響,放射性物質發(fā)生泄漏摔踱。R本人自食惡果不足惜虐先,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望派敷。 院中可真熱鬧蛹批,春花似錦、人聲如沸篮愉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽试躏。三九已至猪勇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颠蕴,已是汗流浹背泣刹。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裁替,地道東北人项玛。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓貌笨,卻偏偏與公主長得像弱判,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锥惋,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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