React Native: Difference between revisions
Line 222: | Line 222: | ||
) | ) | ||
} | } | ||
export default App</syntaxhighlight> | export default App | ||
</syntaxhighlight> | |||
==Implement in Component(Activity)== | |||
In the initial component make sure we pass the navigation to the menu. | |||
<syntaxhighlight lang="js"> | |||
const Home = (props) => { | |||
const { navigate } = props.navigation; | |||
return ( | |||
<View style={styles.container}> | |||
<Header message="Press to Login"></Header> | |||
<Hero /> | |||
<Menu navigate={navigate} /> | |||
</View> | |||
); | |||
}; | |||
</syntaxhighlight> | |||
==Implement in Menu== | |||
So now we have navigate passed around we can use it in the Menu. | |||
<syntaxhighlight lang="js"> | |||
<View style={styles.buttonRow}> | |||
<TouchableOpacity style={styles.buttonStyles} onPress={onPress}> | |||
<Text style={styles.buttonText}>BLOG</Text> | |||
</TouchableOpacity> | |||
<TouchableOpacity style={styles.buttonStyles} onPress={()=>props.navigate('ContactRoute')}> | |||
<Text style={styles.buttonText}>CONTACT</Text> | |||
</TouchableOpacity> | |||
</View> | |||
</syntaxhighlight> |
Revision as of 05:38, 11 December 2020
Introduction
Why
- True native app
- Performance is great
- Easy to learn
- Shared across platforms
- Good community
==Components
- React uses components to build apps
- React Native has many components
- Including translate features
Installation
sudo npm i -g react-native-cli
sudo npm i -g create-react-native
Create Project
Note ignite is a useful tool for creating components in react-native
react-native init reactiveNativeCLI
npx create-react-native-app globo
expo start
Sample App.js
This is not much different to java and Xamarin.
App.js
import React from 'react';
import Home from './app/views/Home.js'
export default class App extends React.Component {
render() {
return (
<Home />
)
}
}
Home.js
import React from "react";
import { Text, View } from "react-native";
export default class Home extends React.Component {
render() {
return (
<View>
<Text>This will be the homepage</Text>
<Text>These other lines are here</Text>
<Text>So you are not mad</Text>
</View>
)
}
}
Styles
Inline Styles
These can be defined with double brackets. Note React supports flex :)
..
return (
<View style={styles.container}>
<Header message = 'Press to Login'></Header>
<Text style={{flex:8}}>This will be the homepage</Text>
<Text style={{flex:6}}>These other lines are here</Text>
</View>
)
..
Using const Styles
Simple create a style and attach it to the component
import React, { useState } from 'react';
import {StyleSheet, Text, View} from 'react-native';
const Header = (props) => {
const [loggedIn, setLoggedIn] = useState(false);
const toggleUser = () => {
const newLoggedIn = loggedIn ? false : true
setLoggedIn( newLoggedIn)
}
const display = loggedIn ? 'Sample User' : props.message
return (
<View style={styles.headStyle}>
<Text style={styles.headText} onPress={toggleUser}>{display}</Text>
</View>
)
}
const styles = StyleSheet.create({
headText: {
textAlign: 'right',
color: '#ffffff',
fontSize: 30,
},
headStyle: {
paddingTop: 30,
paddingBottom: 10,
paddingRight: 10,
backgroundColor: '#35605a'
},
})
export default Header
Platform Support
There are API in the Platform package to support the platforms. These provide helpers for things which are platform specific e.g. version, dimensions and others. You can have React load the appropriate js by name a file Home.ios.js and Home.android.js and it will load the correct one.
Using Images
This is how to use the image without assets.
...
import { StyleSheet, Text, View, Image } from "react-native";
...
return (
<View style={styles.headStyle}>
<Image
style={styles.logoStyle}
source={require("./img/Globo_logo_REV.png")}
/>
<Text style={styles.headText} onPress={toggleUser}>
{display}
</Text>
</View>
);
....
const styles = StyleSheet.create({
...
logoStyle: {
flex: 1,
width: undefined,
height: undefined,
},
});
Detecting Touch
Alert
Could not get this to work on the web so here is an implementation
import { Alert, Platform } from 'react-native'
const alertPolyfill = (title, description, options, extra) => {
const result = window.confirm([title, description].filter(Boolean).join('\n'))
if (result) {
const confirmOption = options.find(({ style }) => style !== 'cancel')
confirmOption && confirmOption.onPress()
} else {
const cancelOption = options.find(({ style }) => style === 'cancel')
cancelOption && cancelOption.onPress()
}
}
const alert = Platform.OS === 'web' ? alertPolyfill : Alert.alert
export default alert
Detecting Press
This was the approach. Not sure the benefits between TouchableOpacity. Probably looks nice.
<TouchableOpacity style={styles.buttonStyles} onPress={onPress}>
<Text style={styles.buttonText}>ABOUT</Text>
</TouchableOpacity>
Install
We are going to use react-navigation
"@react-native-community/masked-view": "^0.1.10",
"@react-navigation/native": "^5.8.10",
"@react-navigation/stack": "^5.12.8",
Configure
In App.js create an object containing all of the routes and the initial route
import React from "react";
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import Contact from "./views/Contact";
import Home from "./views/Home";
const Stack = createStackNavigator();
export function MyStack() {
return (
<NavigationContainer>
<Stack.Navigator
initialRouteName="HomeRoute"
screenOptions={{
headerShown: false,
}}
>
<Stack.Screen name="HomeRoute" component={Home} />
<Stack.Screen name="ContactRoute" component={Contact} />
</Stack.Navigator>
</NavigationContainer>
);
}
export default MyStack;
Implement in App
We need to change the app to use the routing instead on a hardcoded activity
import React from 'react';
import { MyStack } from './app/Routing';
function App() {
return (
<MyStack />
)
}
export default App
Implement in Component(Activity)
In the initial component make sure we pass the navigation to the menu.
const Home = (props) => {
const { navigate } = props.navigation;
return (
<View style={styles.container}>
<Header message="Press to Login"></Header>
<Hero />
<Menu navigate={navigate} />
</View>
);
};
Implement in Menu
So now we have navigate passed around we can use it in the Menu.
<View style={styles.buttonRow}>
<TouchableOpacity style={styles.buttonStyles} onPress={onPress}>
<Text style={styles.buttonText}>BLOG</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.buttonStyles} onPress={()=>props.navigate('ContactRoute')}>
<Text style={styles.buttonText}>CONTACT</Text>
</TouchableOpacity>
</View>