最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React Native自定義路由管理的深入理解

 更新時間:2021年08月04日 14:34:18   作者:xiangzhihong  
路由管理的功能主要指的頁面跳轉(zhuǎn)、goBack、帶參數(shù)跳轉(zhuǎn)等功能,這篇文章主要給大家介紹了關(guān)于React Native自定義路由管理的相關(guān)資料,需要的朋友可以參考下

1、自定義路由

眾所周知,不管是在原生Android還是iOS,它們都有一個默認(rèn)的路由路由棧管理類。由于React Native官方?jīng)]有提供路由管理的組件,所以我們需要使用react-navigation插件提供的Stack.Navigator組件來管理路由。

Stack.Navigator使用的命名路由,所謂命名路由,指的是路由需要先聲明然后才能使用。為了方便管理路由頁面,我們會將路由放到一個統(tǒng)一的位置,比如screens包下,如下所示。

然后,我們在項目的screens/index.js文件中新建一個常量,主要用來管理聲明的路由,如下所示。

export const stacks = [
  {
    name: 'AllMovieScreen',
    component: AllMovieScreen,
    options: {headerShown: false},
  },
  {
    name: 'CitySelectScreen',
    component: CitySelectScreen,
    options: {title: '選擇城市'},
  },
  …. //省略其他路由頁面
];

然后,我們再新建一個MainStackScreen.js文件,用來實現(xiàn)路由的跳轉(zhuǎn)、返回等操作。同時,MainStackScreen類的另一個作用是統(tǒng)一導(dǎo)航欄的樣式,代碼如下所示。

onst MainStack = createStackNavigator();

function MainStackScreen({navigation}) {
  return (
    <MainStack.Navigator
      initialRouteName="App"
      screenOptions={{
        headerTitleAlign: 'center',
        headerStyle: {
          shadowOffset: {width: 0, height: 0},
          shadowColor: '#E5E5E5',
          backgroundColor: '#fff',
        },
        gestureEnabled: true,
        headerBackTitleVisible: false,
        headerLeft: () => (
          <TouchableOpacity
            onPress={() => navigation.goBack()}
            style={{padding: 10, paddingRight: 30}}>
            <Icon name="chevron-thin-left" size={20} color="#222222" />
          </TouchableOpacity>),
      }}>
      <MainStack.Screen
        name="App"
        component={BottomTab}
        options={{headerShown: false}}/>
      {stacks.map((item, index) => (
        <MainStack.Screen
          key={index.toString()}
          name={item.name}
          component={item.component}
          options={item.options}/>
      ))}
    </MainStack.Navigator>
  );
}

export default MainStackScreen;

在上面的代碼,我們創(chuàng)建了一個creens/index.js文件來申明應(yīng)用的路由,然后在MainStackScreen 類中使用map循環(huán)完成路由的注冊。可以看到,經(jīng)過上面的處理后,路由管理是非常清晰的,當(dāng)有新的頁面時只需要往creens/index.js文件中添加路由即可。

2、Tab導(dǎo)航

在React Native應(yīng)用開發(fā)中,react-navigation除了提供路由管理功能外,還支持Tab導(dǎo)航和Drawer導(dǎo)航。并且,在最新的版本中,Tab導(dǎo)航、Drawer導(dǎo)航和Stack導(dǎo)航所依賴的庫是分開的,所以在開發(fā)過程中需要單獨安裝。

對于Tab導(dǎo)航來說,需要在項目中安裝Tab導(dǎo)航需要的bottom-tabs庫,命令如下。

npm install @react-navigation/bottom-tabs    

創(chuàng)建Tab導(dǎo)航時需要用到createBottomTabNavigator()方法,它需要提供導(dǎo)航器和路由兩個屬性,分別對應(yīng)Tab.Navigator和Tab.Screen兩個組件,最后還需要使用NavigationContainer組件包裹它們,如下所示。

import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
import {NavigationContainer} from '@react-navigation/native';

const BottomTabs = createBottomTabNavigator();

export default function BottomTabScreen() {
  return (
    <NavigationContainer>
      <BottomTabs.Navigator
        initialRouteName="Home"
        screenOptions={({route}) => ({
          tabBarIcon: ({focused}) => {
            return (
              <Image source={ focused? tabImage[`${route.name}_active`]
                    : tabImage[route.name]
                }
                style={{width: 26, height: 26}}/>
            ); }})}
        tabBarOptions={{
          activeTintColor: 'tomato',
          inactiveTintColor: 'gray',
          style: {
            backgroundColor: '#fff',
          },
        }}>
        <BottomTabs.Screen
          name="Home"
          component={HomeScreen}
          options={{
            tabBarLabel: '電影',
          }}/>
         
…. //省略其他代碼

        <BottomTabs.Screen
          name="Mine"
          component={MineScreen}
          options={{
            tabBarLabel: '我的',
          }}/>
      </BottomTabs.Navigator>
    </NavigationContainer>
  );
}

同時,bottom-tabs插件還提供了很多其他有用的組件和屬性,開發(fā)者可以根據(jù)需要進(jìn)行選擇。運行上面的代碼,效果下圖所示。

3、數(shù)據(jù)回傳

有時候,我們有這樣一種需求:跳轉(zhuǎn)到下一個頁面,并在下一個頁面選擇了數(shù)據(jù)后進(jìn)行回傳。比如:

在上面的場景中,我們需要對活動列表進(jìn)行篩選,那么在跳轉(zhuǎn)到活動篩選頁面后,需要回傳選中的活動類型,對于這種場景,我們需要對react-navigation進(jìn)行怎樣的處理呢?

首先,我們在screens/index.js文件中注冊活動類型頁面,如下所示。

{
  name: 'SelectorScreen',
  component: SelectorScreen,
  options: nav => {
    const {route} = nav;
    const {params = {}} = route;
    const {title = '活動類型', onRightPress = () => {}} = params;
    return {
       title,
       headerRight: () => (
         <TouchableOpacity
            onPress={onRightPress}
            style={styles.button}>
            <Text style={{color: '#fff', fontSize: 14}}>確定</Text>
         </TouchableOpacity>
        ),
      };
    },
  }

同時,活動篩選頁面的數(shù)據(jù)是由活動列表頁面?zhèn)鬟f過來的。所以在使用的時候,只需要使用上文封裝好的路由工具執(zhí)行跳轉(zhuǎn)操作即可,代碼如下。

navigate('SelectorScreen', {
      values: categories.map(c => c.andGroupName),
      defaultValues: categoryName,
      onConfirm: changeCategory,
    });

可以看到,為了獲取篩選頁面選擇的數(shù)據(jù),我們在跳轉(zhuǎn)的時候定義了一個onConfirm回調(diào)函數(shù)。接著,我們在新建的活動篩選頁面接收上一個頁面?zhèn)鬟f過來的活動數(shù)據(jù)并使用列表展示出來即可,如下所示。

function SelectorScreen({navigation, route}) {
  const {values = [], defaultValues = [], onConfirm} =route.params || {};
  const [selected, setSelected] = useState(defaultValues);

  const _onRightPress = () => {
    onConfirm(selected);
    navigation.goBack();
  };

  useEffect(() => {
    navigation.setParams({onRightPress: _onRightPress});
  }, [selected]);

  const onPressItem = val => {
    let arr = [];
arr = [val];  
setSelected(arr);
  };

  const renderItem = ({item}) => {
    const renderRight = () => {
    const isSelected = selected.includes(item);
    return (
      <ListItem
        text={item}
        renderRight={renderRight}
        onPress={() => onPressItem(item)} />
    );
  };

  return (
    <View style={styles.bg}>
      <FlatList
        keyExtractor={(item, index) => item + index}
        data={values}
        renderItem={renderItem}
        ListFooterComponent={<View height={120} />} />
    </View>
  );
};

const styles = StyleSheet.create({
 …. //省略樣式代碼
});

export default SelectorScreen;

選擇完活動類型之后,如何將選擇的結(jié)果返回給上一個頁面呢。此時就用到了前文定義的onConfirm回調(diào)函數(shù),如下所示。

const {values = [], defaultValues = [], onConfirm} =route.params || {};

const _onRightPress = () => {
    onConfirm(selected);        //onConfirm回調(diào)函數(shù)回傳數(shù)據(jù)
    navigation.goBack();
 };

總結(jié)

到此這篇關(guān)于React Native自定義路由管理的文章就介紹到這了,更多相關(guān)React Native自定義路由管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React SSR樣式及SEO的實踐

    React SSR樣式及SEO的實踐

    這篇文章主要介紹了React SSR樣式及SEO的實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Redux DevTools不能顯示數(shù)據(jù)問題

    Redux DevTools不能顯示數(shù)據(jù)問題

    這篇文章主要介紹了Redux DevTools不能顯示數(shù)據(jù)問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • React中Redux Hooks的使用詳解

    React中Redux Hooks的使用詳解

    這篇文章主要介紹了React Redux Hooks的使用詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • React HOC高階組件深入講解

    React HOC高階組件深入講解

    高階組件就是接受一個組件作為參數(shù)并返回一個新組件(功能增強(qiáng)的組件)的函數(shù)。這里需要注意高階組件是一個函數(shù),并不是組件,這一點一定要注意,本文給大家分享React 高階組件HOC使用小結(jié),一起看看吧
    2022-10-10
  • React + webpack 環(huán)境配置的方法步驟

    React + webpack 環(huán)境配置的方法步驟

    本篇文章主要介紹了React + webpack 環(huán)境配置的方法步驟,詳解的介紹了開發(fā)環(huán)境的配置搭建,有興趣的可以了解一下
    2017-09-09
  • react中value與defaultValue的區(qū)別及說明

    react中value與defaultValue的區(qū)別及說明

    這篇文章主要介紹了react中value與defaultValue的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解React開發(fā)必不可少的eslint配置

    詳解React開發(fā)必不可少的eslint配置

    本篇文章主要介紹了詳解React開發(fā)必不可少的eslint配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • React跨路由組件動畫實現(xiàn)

    React跨路由組件動畫實現(xiàn)

    在 React 中路由之前的切換動畫可以使用 react-transition-group 來實現(xiàn),但對于不同路由上的組件如何做到動畫過渡是個很大的難題,目前社區(qū)中也沒有一個成熟的方案,本文給大家分享React跨路由組件動畫實現(xiàn),感興趣的朋友一起看看吧
    2023-10-10
  • react-native?父函數(shù)組件調(diào)用類子組件的方法(實例詳解)

    react-native?父函數(shù)組件調(diào)用類子組件的方法(實例詳解)

    這篇文章主要介紹了react-native?父函數(shù)組件調(diào)用類子組件的方法,通過詳細(xì)步驟介紹了React 函數(shù)式組件之父組件調(diào)用子組件的方法,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • React+CSS?實現(xiàn)繪制豎狀柱狀圖

    React+CSS?實現(xiàn)繪制豎狀柱狀圖

    這篇文章主要介紹了React+CSS?實現(xiàn)繪制豎狀柱狀圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹。具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09

最新評論

滨州市| 罗甸县| 诏安县| 万盛区| 青海省| 抚远县| 镇赉县| 武穴市| 库车县| 永德县| 武义县| 阿克苏市| 察隅县| 盐城市| 岑巩县| 柘城县| 蓝田县| SHOW| 舒兰市| 阿拉善左旗| 曲水县| 横山县| 红河县| 霍州市| 阿瓦提县| 东台市| 长治县| 大同县| 德江县| 沈丘县| 塔河县| 博客| 香格里拉县| 西乌| 合山市| 桐城市| 宜宾市| 宜州市| 五常市| 礼泉县| 阿图什市|