React Native封裝Toast與載入Loading組件

来源:https://www.cnblogs.com/guangqiang/archive/2018/09/07/9602093.html
-Advertisement-
Play Games

React Native開發封裝Toast與載入Loading組件 在App開發中,我們避免不了使用的兩個組件,一個Toast,一個網路載入Loading,在RN開發中,也是一樣,React Native官方並沒有提供者這兩個常用組件,需要開發者自己根據需求來自定義。作者就在其他組件的基礎上在進行二 ...


React Native開發封裝Toast與載入Loading組件

在App開發中,我們避免不了使用的兩個組件,一個Toast,一個網路載入Loading,在RN開發中,也是一樣,React Native官方並沒有提供者這兩個常用組件,需要開發者自己根據需求來自定義。作者就在其他組件的基礎上在進行二次封裝,使用起來更加簡單,更具擴展性,同學們只需將Toast與Loading文件拖到項目中,install對應的組件庫即可

效果圖

gif
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,支持回調,使用場景類似於登錄成功,顯示1500毫秒toast,然後在回調函數中跳轉到其他頁面
  • 顯示success的長toast,顯示時長 + 500毫秒
  • 顯示success的長toast,顯示時長 + 500毫秒,支持回調,使用場景類似於登錄成功,顯示1000毫秒toast,然後跳轉到其他頁面
  • 顯示warning的toast,使用場景類似於登錄表單,手機號填寫錯誤
  • 顯示報錯的toast,使用場景類似於登錄表單,提交表單失敗

Loading組件

Loading組件最常用的使用場景就是網路請求時,數據還沒有請求回來之前,頁面最上層顯示一個正在載入的loading框,一來能夠防止用戶在網路請求時又做其他的操作,二來可以給用戶一個更好的體驗,不至於頁面空白,顯得突兀

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

這裡作者建議使用redux來控制Loading的顯示與隱藏,這樣不用在每一個需要網路請求的頁面都手動去調用顯示與隱藏,更高端的Loading使用技巧可以參照作者的React Native開發項目: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()
    }
  }

}

更多文章

  • 作者React Native開源項目OneM【500+ star】地址(按照企業開發標準搭建框架完成開發的):https://github.com/guangqiang-liu/OneM:歡迎小伙伴們 star
  • 作者簡書主頁:包含60多篇RN開發相關的技術文章http://www.jianshu.com/u/023338566ca5歡迎小伙伴們:多多關註,多多點贊
  • 作者React Native QQ技術交流群:620792950 歡迎小伙伴進群交流學習
  • 友情提示:在開發中有遇到RN相關的技術問題,歡迎小伙伴加入交流群(620792950),在群里提問、互相交流學習。交流群也定期更新最新的RN學習資料給大家,謝謝大家支持!

小伙伴們掃下方二維碼加入RN技術交流QQ群

QQ群二維碼,500+ RN工程師在等你加入哦
QQ群二維碼,500+ RN工程師在等你加入哦
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果有童鞋linux上還未安裝mysql資料庫可以參考我上一篇博客 (1)首先確保 linux服務上的 mysql 的3306埠是對外開放的 編輯 vi /etc/sysconfig/iptables 將 如下 內容拷貝進去(註意 :不要粘貼在文件的最後 , 否則會不起作用,大致應放在倒數第三行 ...
  • 一.mysql日誌概述 在mysql中,有4種不同的日誌,分別是錯誤日誌,二進位日誌(binlog日誌),查詢日誌,慢查詢日誌。這此日誌記錄著資料庫在不同方面的蹤跡(區別sql server里只有errorlog日誌,並藉助了dmv來做分析)。接下來幾篇里詳細介紹這幾種日誌的作用和使用方法,利用這些 ...
  • 使用SSMS資料庫管理工具修改PRIMARY KEY 1、連接資料庫,選擇數據表-》右鍵點擊-》選擇設計(或者展開鍵,選擇要修改的鍵,右鍵點擊,選擇修改,後面步驟相同)。 2、選擇要修改的數據列-》右鍵點擊-》選擇索引/鍵。 3、在索引/鍵彈出框中-》選擇要修改的主鍵-》類型選擇主鍵-》點擊列。 4 ...
  • 1. 引言 Pandas是一個開源的Python數據分析庫。Pandas把結構化數據分為了三類: Series,1維序列,可視作為沒有column名的、只有一個column的DataFrame; DataFrame,同Spark SQL中的DataFrame一樣,其概念來自於R語言,為多column ...
  • 使用SSMS資料庫管理工具修改UNIQUE約束 1、連接資料庫,選擇數據表-》右鍵點擊-》選擇設計(或者展開鍵,選擇要修改的鍵,右鍵點擊,選擇修改,後面步驟相同)。 2、選擇要修改的數據列-》右鍵點擊-》選擇索引/鍵。 3、在索引/鍵彈出框中-》選擇要修改的唯一約束-》選擇約束類型-》點擊列。 4、 ...
  • 一:個人看法 Mysql Group Replication 隨著5.7發佈3年了。作為技術愛好者。mgr 是繼 oracle database rac 之後。 又一個“真正” 的群集,怎麼做到“真正” ? 怎麼做到解決複製的延遲,怎麼做到強數據一致性?基於全局的GTID就能解決? 圍繞這些問題進行 ...
  • 最近很多人問小編現在學習大數據這麼多,他們都是如何學習的呢。很多初學者在萌生向大數據方向發展的想法之後,不免產生一些疑問,應該怎樣入門?應該學習哪些技術?學習路線又是什麼?今天小編特意為大家整理了一份大數據從入門到精通的學習路線。並且附帶學習資料和視頻。希望能夠幫助到大家。大數據學習資料分享群:11 ...
  • 從安裝操作系統到完成oracle安裝 1、安裝centos7 下載CentOS7 iso安裝包,配置虛擬機,由於只進行oracle安裝練習,隨便配置20G空間。選擇安裝文件。 開機,開始安裝系統: 直接選擇安裝選項: 等待載入: 選擇英文: 直接選自動分配磁碟: 選擇進行最小化安裝,節約空間。 設置 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...