React?Native實現(xiàn)Toast輕提示和loading效果
前言
使用react native的小伙伴都知道,官方并未提供輕提示組件,只提供了ToastAndroid API,顧名思義,只能再安卓環(huán)境下使用,對于ios就愛莫能助,故此,只能通過官方的核心組件,自行封裝,實現(xiàn)Toast功能。
實現(xiàn)
創(chuàng)建文件
首先我們需要創(chuàng)建一個Toast組件,引入對應(yīng)需要的依賴,icon等等
聲明數(shù)據(jù)類型,通用方法
import React, {Component} from 'react'; import {View, Text, StyleSheet, Animated, Easing} from 'react-native'; import icon_success from '../assets/images/icon-success.png'; import icon_error from '../assets/images/icon-error.png'; import icon_loading from '../assets/images/icon-loading.png'; import icon_warning from '../assets/images/icon-warning.png'; type StateType = { isVisible: boolean; icon: any; message: string; }; type ParamsType = string | {message: string; duration?: number}; function getParams(data: ParamsType): {message: string; duration: number} { let msg!: string; let dur!: number; if (typeof data === 'string') { msg = data; dur = 2000; } else { msg = data.message; dur = data.duration != null ? data.duration : 2000; } return { message: msg, duration: dur, }; }
實現(xiàn)樣式和UI層次渲染
我們需要創(chuàng)建一個class,接收參數(shù),并根據(jù)不同的條件渲染:success、error、warning、show、loading等
并拋出自己的實例
class ToastComponent extends Component<{} | Readonly<{}>, StateType> { timeout!: NodeJS.Timeout; rotate: Animated.Value = new Animated.Value(0); constructor(props: {} | Readonly<{}>) { super(props); this.state = { isVisible: false, icon: null, message: '', }; Toast.setToastInstance(this); } showToast(icon: any, message: string, duration: number) { this.setState({ isVisible: true, icon, message, }); if (duration !== 0) { const timeout = setTimeout(() => { this.closeToast(); }, duration); this.timeout = timeout; } } showRotate() { Animated.loop( Animated.timing(this.rotate, { toValue: 360, duration: 1000, easing: Easing.linear, useNativeDriver: true, }), ).start(); } closeToast() { this.setState({ isVisible: false, icon: null, message: '', }); if (this.timeout) { clearTimeout(this.timeout); } } render() { const {isVisible, icon, message} = this.state; return isVisible ? ( <View style={style.root}> <View style={[style.main, icon === null ? null : style.mainShowStyle]}> {icon && ( <Animated.Image style={[ style.icon, { transform: [ { rotate: this.rotate.interpolate({ inputRange: [0, 360], outputRange: ['0deg', '360deg'], }), }, ], }, ]} source={icon} /> )} <Text style={style.tip}>{message}</Text> </View> </View> ) : null; } } const style = StyleSheet.create({ root: { height: '100%', backgroundColor: 'transparent', position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 99999, alignItems: 'center', justifyContent: 'center', }, main: { maxWidth: 200, maxHeight: 200, backgroundColor: '#00000099', borderRadius: 8, alignItems: 'center', justifyContent: 'center', padding: 20, }, mainShowStyle: { minWidth: 140, minHeight: 140, }, icon: { width: 36, height: 36, resizeMode: 'cover', marginBottom: 20, }, tip: { fontSize: 14, color: '#fff', fontWeight: 'bold', textAlign: 'center', }, });
拋出對外調(diào)用的方法
此時我們需要再聲明一個class,對外拋出方法以供調(diào)用
最后導(dǎo)出即可
class Toast extends Component<{} | Readonly<{}>, {} | Readonly<{}>> { static toastInstance: ToastComponent; static show(data: ParamsType) { const {message, duration} = getParams(data); this.toastInstance.showToast(null, message, duration); } static loading(data: ParamsType) { const {message, duration} = getParams(data); this.toastInstance.showToast(icon_loading, message, duration); this.toastInstance.showRotate(); } static success(data: ParamsType) { const {message, duration} = getParams(data); this.toastInstance.showToast(icon_success, message, duration); } static error(data: ParamsType) { const {message, duration} = getParams(data); this.toastInstance.showToast(icon_error, message, duration); } static warning(data: ParamsType) { const {message, duration} = getParams(data); this.toastInstance.showToast(icon_warning, message, duration); } static clear() { if (this.toastInstance) { this.toastInstance.closeToast(); } } static setToastInstance(toastInstance: ToastComponent) { this.toastInstance = toastInstance; } render() { return null; } }; export {Toast, ToastComponent};
組件掛載
我們需要將UI層組件在入口TSX文件進行掛載,不然Toast無法渲染
/* APP.tsx */ import React from 'react'; import {StatusBar} from 'react-native'; import {SafeAreaProvider} from 'react-native-safe-area-context'; import {ToastComponent} from './src/components/Toast'; const Stack = createStackNavigator(); function App(): JSX.Element { return ( <SafeAreaProvider> <StatusBar barStyle="dark-content" backgroundColor="#EAF7FF" /> <ToastComponent /> </SafeAreaProvider> ); } export default App;
API調(diào)用
掛載完成,接下來,在我們需要用到的地方,調(diào)用即可
import {Toast} from '../../components/Toast'; // Toast.success('登錄成功'); Toast.error('密碼錯誤'); Toast.warning('我是警告'); Toast.loading('加載中,請稍后'); Toast.loading({message: "我是不關(guān)閉的Toast", duration: 0}) Toast.success({message: "我是2秒后關(guān)閉的Toast", duration: 2000}); Toast.clear(); // 手動關(guān)閉
到此這篇關(guān)于React Native實現(xiàn)Toast輕提示和loading的文章就介紹到這了,更多相關(guān)React Native實現(xiàn)Toast輕提示和loading內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react如何使用useRef模仿抖音標題里面添加標簽內(nèi)容
本文介紹了如何模仿抖音發(fā)布頁面,使用div元素作為輸入框,并利用CSS樣式和JavaScript動態(tài)操作DOM,實現(xiàn)類似于input輸入框的功能,感興趣的朋友跟隨小編一起看看吧2024-10-10React中Ant?Design組件日期編輯回顯的實現(xiàn)
本文主要介紹了React中Ant?Design組件日期編輯回顯的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2025-04-04React中useCallback useMemo到底該怎么用
在React函數(shù)組件中,當組件中的props發(fā)生變化時,默認情況下整個組件都會重新渲染。換句話說,如果組件中的任何值更新,整個組件將重新渲染,包括沒有更改values/props的函數(shù)/組件。在react中,我們可以通過memo,useMemo以及useCallback來防止子組件的rerender2023-02-02簡易的redux?createStore手寫實現(xiàn)示例
這篇文章主要介紹了簡易的redux?createStore手寫實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10React 項目遷移 Webpack Babel7的實現(xiàn)
這篇文章主要介紹了React 項目遷移 Webpack Babel7的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09