React 2

危阳
2023-12-01

RN常用组件

view,scrollView,,text,statusBar,TextInput,image,button(不可定制样式没有style样式)pressable作为一个容器包裹 (onpressIn,onpressout,onpress,onlongpress),TouchableOpcaity设置透明度

Model:弹出一个遮盖全层的模态对话框

FlatList(平面列表)  横向,纵向,

两个数据:datarenderItem

data:要渲染的所有数据

renderItem:渲染的一个列表项

<FlatList data={list} renderItem={_renderItem}

let _renderItem=()=>{

//为一个对象,可以将内容进行解析出来

Item每个轮播广告对象    index轮播广告对应的原始数组中的下标

}

RN常用JS  API

1)styleSheet.create() 样式

2)Alert.aler()  模态框

3)ToastAndroid.show() Toast.long/Toast.short

4)AsyncStorage.setItem()/getItem()/removeItem()/clear()

5)useWindowDimensions()     获取当前屏幕尺寸

RN中的异步请求方法

let res=await fetch(url,options)

let data=await res.json()

RN路由导航模块

浏览器:react-router-Dom

脱离浏览器 :react-navigation

1)需要下载四到五个模块

2)在RN中下载必需模块node_module

3)重新构建一遍App安装文件

4)重新进行app重新配置

let {navigator,screen}=createNativeStackNavigator()

为整个项目分配页面/屏幕分配路由

路由(导航容器)>路由列表(导航器)>路由(屏幕)

navigateContainer>navigator>screen(name,component)

如何定制标题栏

方法1:静态配置法(App.js)

<Screen name component options={{title,headerStyle,headerTintColor}}

export default function App() {
  return(
    <NavigationContainer>
      {/*初始路由名称,强制将login为第一位默认首页**/}
        <Navigator initialRouteName='login'>  
          <Screen name="login" component={Login} options={{
            headerShown:false  //是否显示页头/标题栏
          }}/>
          <Screen name="mallDetails" component={MallDetails}options={{
            title:'商品详情',    //标题
            headerStyle:{
              backgroundColor:'green'  //背景颜色 
            },
            headerTintColor:'#fff',  //文字颜色
            headerTitleAlign:'center'   //居中方式
          }} /> 
          <Screen name='mlist' component={MallList} options={{
            title:'社区商城',
            headerStyle:{
              backgroundColor:'green'   //背景颜色
            },
            headerTintColor:'#fff',    //头部文字颜色
            headerTitleStyle:{
              fontWeight:'bold'
            },
            headerTitleAlign:'center',  //文字对齐方式
            headerVisible:false          //头部后退按钮可见
          
          }}/> 
        </Navigator>
    </NavigationContainer>
  )

方法2:动态修改法(路由组件中)

props.navigation.setOptions({})

//只有路由组件(路由地址的组件)的props才能进行解构出:navigation\route
export default function MallList({navigation,route}) {
 //生命周期挂载  空依赖
  useEffect(()=>{
   //异步请求商城首页数据
   //修改顶部标题栏
   //动态修改法    在动态修改法中可以使用设置静态修改法中的内容
   navigation.setOptions({
    headerRight:()=>{ //headerRight只能写函数返回显示内容
      //导入本地图片
      //由于image没有onpress点击事件,所以通过pressable进行包裹
      return(
        //pop返回历史栈中上一页,   popTop:返回历史栈中的第一页
        <Pressable onPress={()=>navigation.popToTop()}>
        <Image  style={{width:34,height:34}}  source={require('../img/user1.png')}></Image>
      </Pressable>
      );
    },
   });
  },[])

补充:

1)image中不支持onPress 所以需要通过pressable进行包裹(onpress/onlongpress/onpressIn/onpressOut)

2)headerRight:()=>{}//headerRight中只能为一个函数,函数中包含内容

动态配置法(navigation.setOptions)的参数会覆盖静态配置法(options)的参数

如何在页面/屏幕间跳转

props.navigation.navigate(目标地址) //导航跳转

props.navigation.goBack()                //导航返回

props.navigation.push(目标地址)       //新页面入历史栈

props.navigation.pop()                         //当前页面从历史栈中弹出,返回上一页面

props.navigation.popToTop()            //所有页面从历史栈中弹出,返回第一个页面

APP.js中的props没有navigation 只有在路由组件中的props中才可以解析出navigation/route才可以实现跳转

如何在跳转时携带参数:

页面1:props.navigation.navigate(目标地址,{})

页面2:props.route中读取上个页面传来的参数

route.params获取传过来的参数

 <View>
      <Text>MallList</Text>
      <Text onPress={()=>{
        navigation.navigate('mallDetails',{id:3,name:'zs'})
      }}>页面跳转</Text>
      <Text onPress={()=>{
        navigation.navigate('mallDetails',{id:4})
      }}>页面跳转2</Text>
    </View>
  )
export default function MallDetails({navigation,route}) {
  console.log(route);
  useEffect(()=>{
//获取上个页面传参
 console.log(route.params);
 //修改当前详情页的标题
 navigation.setOptions({
  title:'可口可乐'
 })
  },[])

注意:useEffect(()=>{})不可以加async 解决方法使用立即调用函数()()

//useState每一个生命周期都是一个单独的闭包

其中的变量外界无法使用,外界的数据变化,内部也无法获取

所以在使用时只能放在一个生命周期中

 类似资料:

相关阅读

相关文章

相关问答