Techno solution
November 28, 2024
109 mint
Table of Content
brew install watchman
npx @react-native-community/cli@latest init MyProject --version latest
MyProject/ ├── android/ ├── ios/ ├── node_modules/ ├── src/ │ ├── components/ │ ├── screens/ │ └── App.js ├── package.json └── README.md
android
directory
contains Android-specific code and configurations.ios
directory
contains iOS-specific code and configurations.src
directory
contains your application's source codexcode-select --install
open ios/MyProject.xcodeproj
npx react-native run-ios
~/.bash_profile
or ~/.zshrc
file:export ANDROID_HOME=$HOME/Library/Android/sdk export PATH=$PATH:$ANDROID_HOME/emulator export PATH=$PATH:$ANDROID_HOME/tools export PATH=$PATH:$ANDROID_HOME/tools/bin export PATH=$PATH:$ANDROID_HOME/platform-tools
npx react-native run-android
import React from 'react';
import { View, Text } from 'react-native';
const MyComponent = () => {
return (
<View>
<Text>Hello, World!</Text>
</View>
);
};
export default MyComponent;
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';
const Counter = () => {
const [count, setCount] = useState(0);
return (
<View>
<Text>{count}</Text>
<Button title="Increment" onPress={() => setCount(count + 1)} />
</View>
);
};
export default Counter;
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
const StyledComponent = () => {
return (
<View style={styles.container}>
<Text style={styles.text}>Styled Text</Text>
</View>
);
};
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: 'center', alignItems: 'center', },
text: { color: 'blue', fontSize: 20, }
});
export default StyledComponent;
npm install @react-navigation/native @react-navigation/stack
npm install react-native-screens react-native-safe-area-context
import * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import HomeScreen from './screens/HomeScreen';
import DetailsScreen from './screens/DetailsScreen';
const Stack = createStackNavigator();
const App = () => {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
navigation
prop provided by React Navigation:import React from 'react';
import { View, Text, Button } from 'react-native';
const HomeScreen = ({ navigation }) => {
return (
<View>
<Text>Home Screen</Text>
<Button title="Go to Details" onPress={() => navigation.navigate('Details')} />
</View>
);
};
export default HomeScreen;
npx react-native link <library-name>
react-native-device-info
:npm install react-native-device-info
npx react-native link react-native-device-info
import React, { useEffect, useState } from 'react';
import { View, Text } from 'react-native';
import DeviceInfo from 'react-native-device-info';
const DeviceInfoComponent = () => {
const [deviceName, setDeviceName] = useState('');
useEffect(() => {
DeviceInfo.getDeviceName().then(name => { setDeviceName(name); });
}, []);
return (
<View>
<Text>Device Name: {deviceName}</Text>
</View> );
};
export default DeviceInfoComponent;
npm install axios
import React, { useEffect, useState } from 'react';
import { View, Text, FlatList } from 'react-native';
import axios from 'axios';
const DataFetchingComponent = () => {
const [data, setData] = useState([]);
useEffect(() => {
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(response => { setData(response.data); })
.catch(error => { console.error(error); }); }, []);
return (
<View>
<FlatList data={data} keyExtractor={item => item.id.toString()}
renderItem={({ item }) => (
<View>
<Text>{item.title}</Text>
</View>
)} />
</View>
);
};
export default DataFetchingComponent;
npm install redux react-redux
// actions.js
export const increment = () => ({ type: 'INCREMENT', });
export const decrement = () => ({ type: 'DECREMENT', });
// reducers.js
const initialState = { count: 0, };
const counterReducer = (state = initialState, action) => {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT': return { count: state.count - 1 };
default: return state;
}
};
export default counterReducer;
// store.js
import { createStore } from 'redux';
import counterReducer from './reducers';
const store = createStore(counterReducer);
export default store;
Provider
component to make the Redux store available to your app, and connect components to the store:// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import Counter from './Counter';
const App = () => {
return (
<Provider store={store}>
<Counter />
</Provider>
);
};
export default App;
// Counter.js
import React from 'react';
import { View, Text, Button } from 'react-native';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './actions';
const Counter = () => {
const count = useSelector(state => state.count);
const dispatch = useDispatch();
return (
<View> <Text>{count}</Text>
<Button title="Increment" onPress={() => dispatch(increment())} />
<Button title="Decrement" onPress={() => dispatch(decrement())} />
</View>
);
};
export default Counter;
open "rndebugger://set-debugger-loc?port=8081"
// __tests__/Counter.test.js
import React from 'react';
import { render } from '@testing-library/react-native';
import Counter from '../Counter';
test('renders correctly', () => {
const { getByText } = render(<Counter />);
expect(getByText('0')).toBeTruthy();
});
npm test
Release
.cd android ./gradlew assembleRelease
Related Articles