\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{aezzat (rathetsu)} \pdfinfo{ /Title (react-native.pdf) /Creator (Cheatography) /Author (aezzat (rathetsu)) /Subject (react-native Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{3B355C} \definecolor{LightBackground}{HTML}{F8F8F9} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{react-native Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{aezzat (rathetsu)} via \textcolor{DarkBackground}{\uline{cheatography.com/194747/cs/40667/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}aezzat (rathetsu) \\ \uline{cheatography.com/rathetsu} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Not Yet Published.\\ Updated 8th October, 2023.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{2} \begin{tabularx}{8.4cm}{x{1.8 cm} x{1.8 cm} x{1.8 cm} x{1.8 cm} } \SetRowColor{DarkBackground} \mymulticolumn{4}{x{8.4cm}}{\bf\textcolor{white}{React vs React Native}} \tn % Row 0 \SetRowColor{LightBackground} Usage Scope & Syntax & Animation \& Gestures & Routing \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} React.js is a JS library for building \seqsplit{Responsive} User \seqsplit{Interfaces} for Building Web \seqsplit{Application}. React 0Native is a framework for creating mobile \seqsplit{applications} with a native feel. & Both use JSX, but React uses HTML tags while React Native uses \textless{}view\textgreater{} \textless{}text\textgreater{} etc. & React uses CSS \seqsplit{animations} on a major scale to achieve \seqsplit{animations} for a web page while the \seqsplit{recommended} way for react native is to use the Animated API. & React uses \seqsplit{react-router} for routing and doesn't have any inbuilt routing \seqsplit{capabilities} but React Native has a built-in Navigator library. \tn % Row Count 20 (+ 18) \hhline{>{\arrayrulecolor{DarkBackground}}----} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{useLocalStorage}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import \{ useState, useEffect \} from 'react'; \newline import AsyncStorage from \seqsplit{'@react-native-async-storage/async-storage';} \newline \newline function useLocalStorage(key, initialValue) \{ \newline const {[}storedValue, setStoredValue{]} = useState(() =\textgreater{} \{ \newline try \{ \newline const item = \seqsplit{AsyncStorage.getItem(key);} \newline return item ? JSON.parse(item) : initialValue; \newline \} catch (error) \{ \newline console.error(error); \newline return initialValue; \newline \} \newline \}); \newline \newline const setValue = async (value) =\textgreater{} \{ \newline try \{ \newline const valueToStore = value instanceof Function ? value(storedValue) : value; \newline \seqsplit{setStoredValue(valueToStore);} \newline await AsyncStorage.setItem(key, \seqsplit{JSON.stringify(valueToStore));} \newline \} catch (error) \{ \newline console.error(error); \newline \} \newline \}; \newline \newline return {[}storedValue, setValue{]}; \newline \} \newline \newline // Usage \newline \newline // const {[}username, setUsername{]} = \seqsplit{useLocalStorage('username'}, 'defaultName');} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{useDeviceOrientation}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import \{ useState, useEffect \} from 'react'; \newline import \{ Dimensions \} from 'react-native'; \newline \newline function useDeviceOrientation() \{ \newline const {[}orientation, setOrientation{]} = useState( \newline \seqsplit{Dimensions.get('window').width} \textgreater{} \seqsplit{Dimensions.get('window').height} \newline ? 'LANDSCAPE' \newline : 'PORTRAIT' \newline ); \newline \newline useEffect(() =\textgreater{} \{ \newline const onChange = (\{ window \}) =\textgreater{} \{ \newline \seqsplit{setOrientation(window.width} \textgreater{} window.height ? 'LANDSCAPE' : 'PORTRAIT'); \newline \}; \newline \newline \seqsplit{Dimensions.addEventListener('change'}, onChange); \newline return () =\textgreater{} \seqsplit{Dimensions.removeEventListener('change'}, onChange); \newline \}, {[}{]}); \newline \newline return orientation; \newline \} \newline \newline \newline // Usage: \newline // const orientation = useDeviceOrientation();} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{User Input}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import React, \{ useState \} from 'react'; \newline import \{ View, TextInput, Button, Text \} from 'react-native'; \newline import axios from 'axios'; \newline import AsyncStorage from \seqsplit{'@react-native-async-storage/async-storage';} \newline \newline const Login = (\{ navigation \}) =\textgreater{} \{ \newline const {[}email, setEmail{]} = useState(''); \newline const {[}password, setPassword{]} = useState(''); \newline const {[}error, setError{]} = useState(''); \newline \newline const handleLogin = async () =\textgreater{} \{ \newline try \{ \newline const response = await \seqsplit{axios.post('YOUR\_API\_ENDPOINT/login'}, \{ \newline email, \newline password, \newline \}); \newline \newline const \{ token \} = response.data; \newline \newline if (token) \{ \newline await \seqsplit{AsyncStorage.setItem('authToken'}, token); \newline \seqsplit{navigation.navigate('Home');} \newline \} \newline \} catch (err) \{ \newline console.error("Login error:", err); \newline setError('Invalid login credentials'); \newline \} \newline \}; \newline \newline return ( \newline \textless{}View\textgreater{} \newline \textless{}TextInput \newline placeholder="Email" \newline value=\{email\} \newline onChangeText=\{setEmail\} \newline autoCapitalize="none" \newline /\textgreater{} \newline \textless{}TextInput \newline placeholder="Password" \newline value=\{password\} \newline onChangeText=\{setPassword\} \newline secureTextEntry \newline /\textgreater{} \newline \textless{}Button title="Login" onPress=\{handleLogin\} /\textgreater{} \newline \{error \&\& \textless{}Text\textgreater{}Error: \{error\}\textless{}/Text\textgreater{}\} \newline \textless{}/View\textgreater{} \newline ); \newline \}; \newline \newline export default Login;} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Securely Store Auth Token}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import * as Keychain from 'react-native-keychain'; \newline \newline // Storing the token securely \newline async function storeToken(token) \{ \newline try \{ \newline await \seqsplit{Keychain.setGenericPassword('userToken'}, token); \newline \} catch (error) \{ \newline console.error('Error storing token:', error); \newline \} \newline \} \newline \newline // Retrieving the token \newline async function getToken() \{ \newline try \{ \newline const credentials = await \seqsplit{Keychain.getGenericPassword();} \newline if (credentials) \{ \newline return credentials.password; \newline \} \newline \} catch (error) \{ \newline console.error('Error retrieving token:', error); \newline \} \newline return null; \newline \} \newline \newline // Clearing the token \newline async function clearToken() \{ \newline try \{ \newline await \seqsplit{Keychain.resetGenericPassword();} \newline \} catch (error) \{ \newline console.error('Error clearing token:', error); \newline \} \newline \}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Context API}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import \{ createContext \} from 'react'; \newline \newline const MyContext = createContext(); \newline \newline export const MyProvider = (\{ children \}) =\textgreater{} \{ \newline const {[}value, setValue{]} = \seqsplit{useState('initialValue');} \newline \newline return ( \newline \textless{}MyContext.Provider value=\{\{ value, setValue \}\}\textgreater{} \newline \{children\} \newline \textless{}/MyContext.Provider\textgreater{} \newline ); \newline \} \newline \newline // Usage \newline \newline import React, \{ useContext \} from 'react'; \newline \newline const MyComponent = () =\textgreater{} \{ \newline const \{ value, setValue \} = useContext(MyContext); \newline \newline return ( \newline \textless{}div\textgreater{} \newline \{value\} \newline \textless{}button onClick=\{() =\textgreater{} setValue('newValue')\}\textgreater{}Set Value\textless{}/button\textgreater{} \newline \textless{}/div\textgreater{} \newline ); \newline \}; \newline \newline // Wrapping components in the provider \newline const App = () =\textgreater{} ( \newline \textless{}MyProvider\textgreater{} \newline \textless{}MyComponent /\textgreater{} \newline \textless{}/MyProvider\textgreater{} \newline );} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{FlatList}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{const DATA = {[} \newline \{ id: '1', title: 'Item 1' \}, \newline \{ id: '2', title: 'Item 2' \}, \newline // ... more items \newline {]}; \newline \newline const Item = (\{ title \}) =\textgreater{} ( \newline \textless{}View style=\{styles.item\}\textgreater{} \newline \textless{}Text style=\{styles.title\}\textgreater{}\{title\}\textless{}/Text\textgreater{} \newline \textless{}/View\textgreater{} \newline ); \newline \newline // Pull to refresh \newline \newline const {[}refreshing, setRefreshing{]} = React.useState(false); \newline \newline const onRefresh = React.useCallback(() =\textgreater{} \{ \newline setRefreshing(true); \newline // Fetch new data and set refreshing to false \newline // For example: \newline // fetchData().then(() =\textgreater{} setRefreshing(false)); \newline \}, {[}{]}); \newline \newline const MyFlatListComponent = () =\textgreater{} ( \newline \textless{}FlatList \newline horizontal=\{false\} \newline refreshing=\{refreshing\} \newline onRefresh=\{onRefresh\} \newline data=\{DATA\} \newline renderItem=\{(\{ item \}) =\textgreater{} \textless{}Item title=\{item.title\} /\textgreater{}\} \newline keyExtractor=\{item =\textgreater{} item.id\} \newline /\textgreater{} \newline );} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Stack Navigation}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import \{ NavigationContainer \} from \seqsplit{'@react-navigation/native';} \newline import \{ createStackNavigator \} from \seqsplit{'@react-navigation/stack';} \newline \newline const Stack = createStackNavigator(); \newline \newline const App = () =\textgreater{} ( \newline \textless{}NavigationContainer\textgreater{} \newline \textless{}Stack.Navigator initialRouteName="Home"\textgreater{} \newline \textless{}Stack.Screen name="Home" component=\{HomeScreen\} /\textgreater{} \newline \textless{}Stack.Screen name="Details" component=\{DetailsScreen\} /\textgreater{} \newline \textless{}/Stack.Navigator\textgreater{} \newline \textless{}/NavigationContainer\textgreater{} \newline );} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Bottom Tab Navigation}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import \{ NavigationContainer \} from \seqsplit{'@react-navigation/native';} \newline import \{ createBottomTabNavigator \} from \seqsplit{'@react-navigation/bottom-tabs';} \newline \newline const Tab = \seqsplit{createBottomTabNavigator();} \newline \newline const App = () =\textgreater{} ( \newline \textless{}NavigationContainer\textgreater{} \newline \textless{}Tab.Navigator\textgreater{} \newline \textless{}Tab.Screen name="Home" component=\{HomeScreen\} /\textgreater{} \newline \textless{}Tab.Screen name="Settings" component=\{SettingsScreen\} /\textgreater{} \newline \textless{}/Tab.Navigator\textgreater{} \newline \textless{}/NavigationContainer\textgreater{} \newline );} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Drawer Navigation}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{import \{ NavigationContainer \} from \seqsplit{'@react-navigation/native';} \newline import \{ createDrawerNavigator \} from \seqsplit{'@react-navigation/drawer';} \newline \newline const Drawer = createDrawerNavigator(); \newline \newline const App = () =\textgreater{} ( \newline \textless{}NavigationContainer\textgreater{} \newline \textless{}Drawer.Navigator initialRouteName="Home"\textgreater{} \newline \textless{}Drawer.Screen name="Home" component=\{HomeScreen\} /\textgreater{} \newline \textless{}Drawer.Screen name="Settings" component=\{SettingsScreen\} /\textgreater{} \newline \textless{}/Drawer.Navigator\textgreater{} \newline \textless{}/NavigationContainer\textgreater{} \newline );} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Redux}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{// npm install redux react-redux redux-thunk \newline \newline // actions/types.js \newline export const FETCH\_DATA\_BEGIN = 'FETCH\_DATA\_BEGIN'; \newline export const FETCH\_DATA\_SUCCESS = 'FETCH\_DATA\_SUCCESS'; \newline export const FETCH\_DATA\_FAILURE = 'FETCH\_DATA\_FAILURE'; \newline \newline // actions/dataActions.js \newline export const fetchDataBegin = () =\textgreater{} (\{ \newline type: FETCH\_DATA\_BEGIN, \newline \}); \newline \newline export const fetchDataSuccess = (data) =\textgreater{} (\{ \newline type: FETCH\_DATA\_SUCCESS, \newline payload: \{ data \}, \newline \}); \newline \newline export const fetchDataFailure = (error) =\textgreater{} (\{ \newline type: FETCH\_DATA\_FAILURE, \newline payload: \{ error \}, \newline \}); \newline \newline // reducers/dataReducer.js \newline const initialState = \{ \newline data: {[}{]}, \newline loading: false, \newline error: null, \newline \}; \newline \newline export default function dataReducer(state = initialState, action) \{ \newline switch (action.type) \{ \newline case FETCH\_DATA\_BEGIN: \newline return \{ \newline ...state, \newline loading: true, \newline error: null, \newline \}; \newline case FETCH\_DATA\_SUCCESS: \newline return \{ \newline ...state, \newline loading: false, \newline data: action.payload.data, \newline \}; \newline case FETCH\_DATA\_FAILURE: \newline return \{ \newline ...state, \newline loading: false, \newline error: action.payload.error, \newline data: {[}{]}, \newline \}; \newline default: \newline return state; \newline \} \newline \} \newline \newline // reducers/index.js \newline import \{ combineReducers \} from 'redux'; \newline import dataReducer from './dataReducer'; \newline \newline export default combineReducers(\{ \newline data: dataReducer, \newline \}); \newline \newline // configureStore.js \newline import \{ createStore, applyMiddleware \} from 'redux'; \newline import thunk from 'redux-thunk'; \newline import rootReducer from './reducers'; \newline \newline const initialState = \{\}; \newline \newline const middleware = {[}thunk{]}; \newline \newline const store = createStore( \newline rootReducer, \newline initialState, \newline \seqsplit{applyMiddleware(...middleware)} \newline ); \newline \newline export default store; \newline \newline \newline // App.js \newline import React from 'react'; \newline import \{ Provider \} from 'react-redux'; \newline import store from './configureStore'; \newline import Home from './Home'; // your main component \newline \newline const App = () =\textgreater{} ( \newline \textless{}Provider store=\{store\}\textgreater{} \newline \textless{}Home /\textgreater{} \newline \textless{}/Provider\textgreater{} \newline ); \newline \newline export default App; \newline \newline // Usage in components \newline import \{ connect \} from 'react-redux'; \newline import \{ fetchDataBegin \} from './actions/dataActions'; \newline \newline const MyComponent = (\{ data, fetchData \}) =\textgreater{} \{ \newline // use data or call fetchData as needed \newline \}; \newline \newline const mapStateToProps = state =\textgreater{} (\{ \newline data: state.data.data, \newline \}); \newline \newline const mapDispatchToProps = dispatch =\textgreater{} (\{ \newline fetchData: () =\textgreater{} \seqsplit{dispatch(fetchDataBegin())}, \newline \}); \newline \newline export default connect(mapStateToProps, \seqsplit{mapDispatchToProps)(MyComponent);}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{React Native app feel smooth on animations}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{// The primary reason and an important one why well-built native apps feel so smooth \newline // are by avoiding expensive operations during interactions and animations. \newline // React Native has a limitation that there is only a single JS execution thread, \newline // but you can use `InteractionManager` to make sure long-running work is scheduled \newline // to start after any interactions/animations have completed. \newline \newline import React, \{ useState, useEffect \} from 'react'; \newline import \{ Text, InteractionManager \} from 'react-native'; \newline \newline const ExpensiveComponent = () =\textgreater{} \{ \newline const {[}isDataLoaded, setDataLoaded{]} = useState(false); \newline \newline useEffect(() =\textgreater{} \{ \newline \seqsplit{InteractionManager.runAfterInteractions(()} =\textgreater{} \{ \newline loadData(); \newline \}); \newline \}, {[}{]}); \newline \newline const loadData = () =\textgreater{} \{ \newline // Simulate a data loading process \newline setTimeout(() =\textgreater{} \{ \newline setDataLoaded(true); \newline \}, 2000); \newline \}; \newline \newline if (!isDataLoaded) \{ \newline return \textless{}Text\textgreater{}Loading...\textless{}/Text\textgreater{}; \newline \} \newline \newline return \textless{}Text\textgreater{}Data Loaded!\textless{}/Text\textgreater{}; \newline \}; \newline \newline export default ExpensiveComponent;} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}