1. 程式人生 > >《React-Native系列》元件封裝之Dialog(iOS和Android通用)

《React-Native系列》元件封裝之Dialog(iOS和Android通用)

最近在專案中封裝了個Dialog元件,iOSAndroid平臺上通用。

元件Dialog顯示時,從頁面頂部滑動到中間,點選確認或取消後,從頁面底部劃出頁面,需要注意動畫的實現。

原始碼如下:

[javascript] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
  1. 'use strict';  
  2. import React, { Component } from 'react';  
  3. import {  
  4.   StyleSheet,  
  5.   View,  
  6.   Image,  
  7.   Text,  
  8.   TouchableHighlight,  
  9.   Animated,  
  10.   Easing,  
  11.   Dimensions,  
  12. } from 'react-native';  
  13. import TimerMixin from 'react-timer-mixin';  
  14. const {width, height} = Dimensions.get('window');  
  15. const navigatorH = 64; // navigator height
  16. const [aWidth, aHeight] = [270, 108];  
  17. const [left, top] = [0, 0];  
  18. const [middleLeft, middleTop] = [(width - aWidth) / 2, (height - aHeight) / 2 - navigatorH];  
  19. /** 
  20. * Dialog元件 
  21. * <Dialog ref="dialog" callback={this.callback.bind(this)}/> 
  22. * 呼叫show方法,調起元件   this.refs.dialog.show("確定刪除嗎"); 
  23. */
  24. exportdefaultclass Dialog extends Component {  
  25.   mixins = [TimerMixin];  
  26.   parent ={};  
  27.   constructor(props) {  
  28.     super(props);  
  29.     this.state = {  
  30.       offset: new
     Animated.Value(0),  
  31.       opacity: new Animated.Value(0),  
  32.       title: "",  
  33.       hide: true,  
  34.     };  
  35.   }  
  36.   render() {  
  37.     if(this.state.hide){  
  38.       return (<View />)  
  39.     } else {  
  40.       return (  
  41.         <View style={styles.container} >  
  42.           <Animated.View style={ styles.mask } >  
  43.           </Animated.View>  
  44.           <Animated.View style={[styles.tip , {transform: [{  
  45.                 translateY: this.state.offset.interpolate({  
  46.                  inputRange: [0, 1,2],  
  47.                  outputRange: [0, middleTop,height]  
  48.                 }),  
  49.               }]  
  50.             }]}>  
  51.             <View style={styles.tipTitleView}>  
  52.               <Text style={styles.tipTitleText}>{this.state.title}</Text>  
  53.             </View>  
  54.             <View style={styles.btnView}>  
  55.               <TouchableHighlight style={styles.cancelBtnView} underlayColor='#f0f0f0' onPress={this.cancelBtn.bind(this)}>  
  56.                 <Text style={styles.cancelBtnText}>取消</Text>  
  57.               </TouchableHighlight>  
  58.               <TouchableHighlight style={styles.okBtnView} underlayColor='#f0f0f0' onPress={this.okBtn.bind(this)}>  
  59.                 <Text style={styles.okBtnText}>確定</Text>  
  60.               </TouchableHighlight>  
  61.             </View>  
  62.           </Animated.View>  
  63.         </View>  
  64.       );  
  65.     }  
  66.   }  
  67.   //顯示動畫
  68.   in() {  
  69.     Animated.parallel([  
  70.       Animated.timing(  
  71.         this.state.opacity,  
  72.         {  
  73.           easing: Easing.linear,  
  74.           duration: 500,  
  75.           toValue: 0.8,  
  76.         }  
  77.       ),  
  78.       Animated.timing(  
  79.         this.state.offset,  
  80.         {  
  81.           easing: Easing.linear,  
  82.           duration: 500,  
  83.           toValue: 1,  
  84.         }  
  85.       )  
  86.     ]).start();  
  87.   }  
  88.   //隱藏動畫
  89.   out(){  
  90.     Animated.parallel([  
  91.       Animated.timing(  
  92.         this.state.opacity,  
  93.         {  
  94.           easing: Easing.linear,  
  95.           duration: 500,  
  96.           toValue: 0,  
  97.         }  
  98.       ),  
  99.       Animated.timing(  
  100.         this.state.offset,  
  101.         {  
  102.           easing: Easing.linear,  
  103.           duration: 500,  
  104.           toValue: 2,  
  105.         }  
  106.       )  
  107.     ]).start();  
  108.     setTimeout(  
  109.       () => {  
  110.         this.setState({hide: true});  
  111.         //還原到頂部
  112.         Animated.timing(  
  113.           this.state.offset,  
  114.           {  
  115.             easing: Easing.linear,  
  116.             duration: 500,  
  117.             toValue: 0,  
  118.           }  
  119.         ).start();  
  120.       },  
  121.       500  
  122.     );  
  123.   }  
  124.   //取消
  125.   cancelBtn(event) {  
  126.     if(!this.state.hide){  
  127.       this.out();  
  128.     }  
  129.   }  
  130.   // doCallback(fn,args){
  131.   //   fn.apply(this.parent, args);
  132.   // }
  133.   //選擇
  134.   okBtn() {  
  135.     if(!this.state.hide){  
  136.       this.out();  
  137.       setTimeout(  
  138.         () => {  
  139.           let {callback} = this.props;  
  140.           callback.apply(null,[]);  
  141.         },  
  142.         500  
  143.       );  
  144.     }  
  145.   }  
  146.   /** 
  147.   * 彈出控制元件 
  148.   * titile: 標題 
  149.   */
  150.   show(title: string) {  
  151.     if(this.state.hide){  
  152.       this.setState({title: title, hide: false}, this.in);  
  153.     }  
  154.   }  
  155. }  
  156. const styles = StyleSheet.create({  
  157.   container: {  
  158.     position:"absolute",  
  159.     width:width,  
  160.     height:height,  
  161.     left:left,  
  162.     top:top,  
  163.   },  
  164.   mask: {  
  165.     justifyContent:"center",  
  166.     backgroundColor:"#383838",  
  167.     opacity:0.8,  
  168.     position:"absolute",  
  169.     width:width,  
  170.     height:height,  
  171.     left:left,  
  172.     top:top,  
  173.   },  
  174.   tip: {  
  175.     width:aWidth,  
  176.     height:aHeight,  
  177.     left:middleLeft,  
  178.     backgroundColor:"#fff",  
  179. 相關推薦

    React-Native系列元件封裝DialogiOSAndroid通用

    最近在專案中封裝了個Dialog元件,iOS和Android平臺上通用。 元件Dialog顯示時,從頁面頂部滑動到中間,點選確認或取消後,從頁面底部劃出頁面,需要注意動畫的實現。 原始碼如下: [javascript] view plain copy

    React Native WebView元件實現的BarCode條形碼、(QRCode)二維碼

    react-native-barCode 採用React Native WebView元件實現的BarCode(條形碼)、QRCode(二維碼),其中QRCode的程式碼是參考 qrcode,修復了qrcode圖片會出現滾動條問題。https://github.com/

    react-native從頭開始封裝三方sdk

    完成了第一步,下面開始飛。 以整合騰訊信鴿推送為例 註冊信鴿申請應用等按照騰訊文件來即可。(注意包名要是app的包名不是library的包名) ps:按照手動配置的方式出現support-v4重複引用問題,嘗試多種方式沒有解決。暫且放棄。 使用jcent

    機器學習演算法CART分類迴歸樹

    CART演算法介紹: 分類和迴歸樹(CART)是應用廣泛的決策樹學習方法。CART同樣由特徵選擇,樹的生成和減枝組成,既可以用於分類也可以用於迴歸。CART的生成就是遞迴的構建二叉決策樹的過程。對迴歸樹用平方誤差最小化(RMSE),對分類樹用基尼指數最小化準則

    pythonSSH互動式非互動式

    python中有一個paramiko,功能強大,用來做SSH比較方便 先上程式碼 import paramikoclass SSHConnection(object): def __init__(self, host, port, username, passwo

    【筆記】移動端H5數字鍵盤input type=number的處理IOSAndroid

    != 字符串 文檔 代碼 || clear tcl rfi 導致 在Vue中的項目,基於VUX-UI開發,一個常見的需求: 1、金額輸入框 2、彈出數字鍵盤 3、僅支持輸入兩位小數,限制最大11位數,不允許0開頭   第一,首先想到額就是在VUX-UI中制定ty

    Linux下源碼安裝NginxUbuntuCentOS通用

    fig 出現 保存 重啟nginx 文件添加 openssl make 檢測 修改方法 1.下載nginx,鏈接地址:http://nginx.org/download/nginx-1.12.2.tar.gz,選擇linux版本(.tar.gz)(Nginx版本為1.12.

    js h5頁面調起AppIOS android的實現方法

    js h5頁面調起App(IOS 和android)的實現方法 第一次寫這個:我們的app是由原聲和h5組成的,當用戶使用瀏覽器開啟我們的頁面時我們會引導使用者使:開啟App 下載App 剛開始我是使用定時器來實現的,當用戶點選了開啟App經過一定時間之後沒有反應,則我們認為她調起App

    Linux擴充套件磁碟空間到根目錄VmwareKVM通用

    最近因為公司伺服器大量構建專案導致虛機的根目錄嚴重不足,本著linux新手的心態到網上查閱資料,真的那個叫百家爭鳴啊(亂抄亂寫亂複製),不容易得解決了這個問題,今天來小結記錄下解決方法。  1. 在虛機管理器中增加掛載盤 伺服器是個測試伺服器,裝了個 KVM 虛擬機器

    頭部導航設定 ios android 同一種樣式 ,app.js舉例

    注意:需要在controller 中注入$ionicConfigProvider //  ios android 都預設讓title居中 $ionicConfigProvider.navBar.al

    Cordova下自簽名證書無法訪問https問題IOSAndroid

    最近準備將專案上架到AppStore,但從17年開始,AppStore稽核條件要求所有網路請求都為https,所以就在內網(192.……)布好了自測環境,並將環境對映到了公網(58.……)。接著問題就

    Array的簡單使用BoostSTL通用

    [//]:#(Array的簡單使用(Boost和STL通用)) # 目錄 - [目錄](#目錄) - [介紹](#介紹) - [使用](#使用) - [Boost和STL的區別](#boost和stl的區別) # 介紹 本來這一次是想簡單介紹一下Boost裡面的協程庫的使用的,但是`Boost.Cor

    REACT NATIVE 系列教程四】重新整理元件RENDER(重新渲染)的三種方式詳解

    開發過遊戲的都應該很清楚,“刷屏”是多麼的重要。其實開發應用也如此,當元件的資料被修改後,如何及時更新元件呈現出最新的資料與效果一樣至關重要。那麼這裡Himi大概講三種常用的方式:this.setState()  【最為常用】這是在事件處理函式中和請求回撥函式中觸發 UI 更新的主要方法。一般情況下setSt

    React-Native系列》15、 RN可觸控元件

    今天,我們來看下ReactNative提供的可觸控元件。 分別為:TouchableHighlight、TouchableNativeFeedback、TouchableOpacity、TouchableWithoutFeedback。 TouchableWithoutFe

    REACT NATIVE 系列教程十三】利用LISTVIEW與TEXTINPUT製作聊天/對話方塊&&獲取元件例項常用的兩種方式

    補充說明:一:很多童鞋問,鍵盤調出來被擋住了,那麼下面給出三個解決方案:1. 在render最外層包一個ScrollView,然後當鍵盤調出時,scrollTo即可實現。2. 在底部新增一個可變化高度的view,根據鍵盤獲取、失去焦點時,進行處理實現二:有的童鞋說對話方塊的背景沒有根據內容長短自適應,OK ,

    React-Native系列》3、RN與native交互Callback、Promise

    pan resolv str string callback 多次調用 modules 函數 等待 接著上一篇《React-Native系列》RN與native交互與數據傳遞,我們接下來研究另外的兩種RN與Native交互的機制 一、Callback機制 首先Calllba

    React-Native系列Android——Native與Javascript通信原理

    from 直接 最新 一點 明顯 rem 負責 receive esp React-Native最核心的是Native與Javascript之間的通信,並且是雙向通信

    基於React Native官方元件Image封裝的具備載入生命週期視覺反饋的元件react-native-loading-image

    react-native-loading-image 基於React Native官方元件Image封裝的具備載入生命週期視覺反饋的元件,具體實現功能如下: 網路圖片Pending狀態渲染,提供閃爍動畫、loading.gif兩種方式 網路圖片Error狀態渲染

    REACT NATIVE 系列教程十】真機執行報錯COMMAND /BIN/SH FAILED WITH EXIT CODE 1 的解決方法

    Himi最近在真機執行遇到  Command /bin/sh failed with exit code 1  的錯誤, 模擬器執行沒有任何問題。此問題已解決,這裡分享下解決方案。先來看下錯誤日誌,如下圖:主要是劃線的部分:1.PhaseScriptExecution Bundle\ React\ Nativ

    React Native】原始碼分析Native UI的封裝管理

      ReactNative作為使用React開發Native應用的新框架,隨著時間的增加,無論是社群還是個人對她的興趣與日遞增。此文目的是希望和大家一起欣賞一下ReactNative的部分原始碼。閱讀原始碼好處多多,讓攻城獅更溜的開發ReactNative應