CS571 W9/10 React Native1/2 HW7/8 笔记
1. React Native 基本常识
1.与安卓设备连接
安卓下载 Expo,使用 USB 连接电脑,打开手机ADB调试。
在 Console 里输入 npm start
以后戳 a
在安卓设备上运行。如果提示 SDK 版本太低检查一下有没有 npm install
2. React Native 的组件
React Native 组件在不同的平台上会被翻译成不同的组件。
React Native 没有 HTML/DOM CSS 的概念。因此 p 标签与 CSS 表等熟悉的概念不再适用。
对于样式,我们使用JS样式表。通过StyleSheet.create
从一个 JS Object 中创建一个样式表。示例代码如下:
import {StyleSheet,Text} from 'react-native' const styles=StyleSheet.create({ p:{ fontSize:16 }, container:{ flex:1, justifyContent:'center', backgroundColor:'green' } }) <Text style={styles.p}>这是一个虚假的p标签</Text> <Text style={[styles.p,styles.thm]}>使用多个样式的方法</Text>
然后列举一些 RN 组件和对应的 React 组件。
React 组件 | RN 组件 | 使用例 | 备注 |
---|---|---|---|
/ |
|||
相对屏幕固定 | |||
可滚动的内容 | |||
style 参数内必须显式指定图片长宽,source 是一个 JS Object ,其中的连接是 uri 并不是 url | |||
Button 必须指定标题!而不是把标题文本夹在标签中间,按压触发是 onPress 不是 onClick! | |||
开关,使用受控组件维护 |
3. 分平台的组件
如果有些组件(例如)只有在安卓/iOS 平台上有?
import {Platform} from "react-native" if (Platform.OS === 'android') return <Component_android/> else return <Component_iOS/>
4. 获取屏幕大小
import {Dimensios} from "react-native" const getScreenSize = () => { const screenWidth = Math.round(Dimensions.get('window').width); const screenHeight = Math.round(Dimensions.get('window').height); return { screenWidth: screenWidth, screenHeight: screenHeight }; }
在大型项目中,建议使用 useMemo 来固定 getScreenSize 函数。
2. React Navigation
1. 什么是React Navigation?
之前的课程使用 React Router 进行导航。
简要来说,React Navigation 是基于 Screen 的概念,因此更适合移动端导航。React Router 基于 path 适用于网页端导航:
<BrowserRouter> <Routes> <Route path="/" element={<Layout/>} > <Route path="index" element={<Home/>}/> <Route path="about-us" element={<AboutUs/>}/> <Route path="*" element={<NoneExist/>}/> </Route> </Routes> </BrowserRouter>
两者的共同之处在于把网页/手机 App 页屏视为 React 组件。
2. React Navigation 的三种形式
- Tab Navigation 屏幕底部的导航栏
- Drawer Navigation 是一个可收纳的导航栏
- Stack Navigation 是一个存放页面的栈,通过返回键来 pop
代码示例(Tab Navigation):
import { NavigationContainer } from '@react-navigation/native'; import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; const BadgerSocialTabs = createBottomTabNavigator(); export default function App() { return ( <NavigationContainer> <BadgerSocialTabs.Navigator > <BadgerSocialTabs.Screen name="NewsFeed" component={NewsFeedScreen} options={{headerShown: false}}/> <BadgerSocialTabs.Screen name="Notifications" component={NotificationScreen}/> <BadgerSocialTabs.Screen name="AboutMe" component={AboutMeScreen} options={{title: "Profile"}}/> </BadgerSocialTabs.Navigator> </NavigationContainer> ); }
最外层使用 NavigationContainer
包裹,BadgerSocialTabs
是一个利用createBottomTabNavigator
制作出来的组件对象。外层是<.Navigator>
内层是 <.Screen>
name 是导航的标签,component 表示要导航去的组件。
options 选项内可以使用title
指定显示的标题,或是用 headerShown:false
来取消显示标题。
3. 导航嵌套&Stack Navigator
上面的代码,NewsFeedScreen
组件里边还可以放一个导航。(例如一个Stack Navigation 表示看的新闻卡片)
注意 NavigationContainer
不能嵌套!所以在 NewsFeedScreen
组件里边放的是Navigator-Screen 两层结构。
import { createNativeStackNavigator } from "@react-navigation/native-stack"; import NewsFeedScreen from '../NewsFeedScreen'; import NewsFeedDetailScreen from '../NewsFeedDetailScreen'; const NewsStack = createNativeStackNavigator(); function NewsFeedStack() { return ( <NewsStack.Navigator> <NewsStack.Screen name="AllPosts" component={NewsFeedScreen} options={{headerShown: false}}/> <NewsStack.Screen name="SpecificPost" component={NewsFeedDetailScreen} options={{headerShown: false}}/> </NewsStack.Navigator> ); }
对于 Stack Navigation 的理解:Navigator 内部的 Screen 们可以视为一个 map,在 name 和 component 间建立联系。
使用跳转:
先使用:const navigation=useNavigation()
再使用:navigation.push(screenName,params)
screenName 是那个 Screen 的 name,而不是 component 名字。
params 表示要传进那个组件里边的 props。
在组件中调用 props:props.route.params
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界