当前位置: 首页 > 知识库问答 >
问题:

react.js - RN中tabView组件点击tab无法切换View内容?

隗翰海
2023-11-21

ReactNative 中的tabview点击tab无法切换view,

import React, { useCallback, useEffect, useMemo, useState } from 'react';import { View, StyleSheet, Dimensions, Text } from 'react-native';import { TabView, SceneMap, TabBar } from 'react-native-tab-view';type Route = {    key: string;    title: string;};type State = {    index: number;    routes: Route[];};const initialTabState: State = {    index: 0,    routes: [        { key: 'tab1', title: 'Tab 1' },        { key: 'tab2', title: 'Tab 2' },        { key: 'tab3', title: 'Tab 3' },        { key: 'tab4', title: 'Tab 4' },        { key: 'tab5', title: 'Tab 5' },        { key: 'tab6', title: 'Tab 6' },        { key: 'tab7', title: 'Tab 7' },        { key: 'tab8', title: 'Tab 8' },    ],};const FirstRoute = () => (    <View style={[styles.scene, { backgroundColor: '#ff4081' }]} />);const SecondRoute = () => (    <View style={[styles.scene, { backgroundColor: '#673ab7' }]} />);const ThirdRoute = () => (    <View style={[styles.scene, { backgroundColor: '#4caf50' }]} />);const FourthRoute = () => (    <View style={[styles.scene, { backgroundColor: '#2196f3' }]} />);const FifthRoute = () => (    <View style={[styles.scene, { backgroundColor: '#ffeb3b' }]} />);const SixthRoute = () => (    <View style={[styles.scene, { backgroundColor: '#9c27b0' }]} />);const SeventhRoute = () => (    <View style={[styles.scene, { backgroundColor: '#ffc107' }]} />);const EighthRoute = () => (    <View style={[styles.scene, { backgroundColor: '#607d8b' }]} />);const TabScreen: React.FC = () => {    const [tabState, setTabState] = useState<State>(initialTabState);    const renderScene = SceneMap({        '1': FirstRoute,        '2': SecondRoute,        '3': ThirdRoute,        '4': FourthRoute,        '5': FifthRoute,        '6': SixthRoute,        '7': SeventhRoute,        '8': EighthRoute,    });    const renderTabBar = (props: any) => (            <TabBar                {...props}                scrollEnabled                tabStyle={styles.tabStyle}                indicatorStyle={styles.indicatorStyle}                style={styles.tabBarStyle}                labelStyle={styles.labelStyle}                onTabPress={({ route }) => {                    console.log(route)                    const index = initialTabState.routes.findIndex(item => item.key == route.key);                    handleIndexChange(index);                }}        />    );    const handleIndexChange = (index: number) => {        setTabState({ ...tabState, index });    };    useEffect(() => {        console.log(tabState.index);    }, [tabState])    return (        <View style={{ flex: 1}}>            <TabView                navigationState={tabState}                renderScene={renderScene}                onIndexChange={handleIndexChange}                initialLayout={{ width: Dimensions.get('window').width }}                renderTabBar={renderTabBar}            />        </View>    );};const styles = StyleSheet.create({    scene: {        flex: 1,    },    tabStyle: {        width: 'auto',    },    indicatorStyle: {        backgroundColor: '#000',    },    tabBarStyle: {        backgroundColor: '#fff',    },    labelStyle: {        color: '#000',    },});export default TabScreen;

"react": "18.2.0",
"react-native": "0.72.6",
"react-native-tab-view": "^3.5.1",

去除自定义tab改成原生的也不行

共有2个答案

西门正平
2023-11-21

SceneMap 里面的key 需要initialTabState 里面routes每一项的key对应,然后你��掉onTabPress 就可以了

刘永望
2023-11-21

从你提供的代码来看,TabScreen组件的逻辑基本上是正确的的。但是在 handleIndexChange 函数中,你使用的是 findIndex 函数,这可能会导致问题。因为 findIndex 函数返回的是找到的元素的索引,如果找不到则返回 -1。这样,当用户在 tab bar 中点击一个不存在的 tab 时,findIndex 将会返回 -1,然后你将这个值设置到 state 中,导致后续的渲染出现问题。

你可以修改 handleIndexChange 函数,确保只有当找到有效的 tab 时才更新 state。具体修改如下:

const handleIndexChange = (index: number) => {    if (index >= 0 && index < initialTabState.routes.length) {        setTabState({ ...tabState, index });    }};

以上修改可以确保只有当 index 在有效的范围内(0到routes.length-1)时,才会更新 state。这样,当用户点击一个不存在的 tab 时,就不会触发 state 的改变,也就不会出现你提到的问题了。

此外,我注意到你在 onTabPress 函数中打印了 route,但这个 route 的具体内容并未在你的代码中定义。如果你想获取当前 tab 的 key 或者 title,你可能需要修改一下这个函数,比如:

const renderTabBar = (props: any) => (    <TabBar    {...props}    scrollEnabled    tabStyle={styles.tabStyle}    indicatorStyle={styles.indicatorStyle}    style={styles.tabBarStyle}    labelStyle={styles.labelStyle}    onTabPress={({ route }) => {        console.log(route.key);  // 打印当前 tab 的 key        const index = initialTabState.routes.findIndex(item => item.key == route.key);        handleIndexChange(index);    }}/>);

这样你就可以在控制台看到当前被点击的 tab 的 key 了。希望这个答案能帮到你!如果你有更多的问题,欢迎继续提问。

 类似资料:
  • 在网页中显示标签。标签页内元素较多时不建议使用,会影响页面性能。 标题 内容 类型 通用 支持布局 responsive, fixed-height, fill, container, fixed 所需脚本 https://c.mipcdn.com/static/v2/mip-vd-tabs/mip-vd-tabs.js 示例 一共支持5种样式 等分固定标签页 <mip-vd-tabs> <s

  • 本文向大家介绍js实现点击切换TAB标签实例,包括了js实现点击切换TAB标签实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现点击切换TAB标签。分享给大家供大家参考。具体如下: 这里演示的选项卡效果代码,无jq,纯JS来实现,灰色风格,没有怎么美化,或许看上去比较普通,不过兼容性和操作起来挺舒服的,风格适用于大部分的网站,或许你会用得上。 先来看看运行效果截图: 在线演示地址

  • 我试图点击一个切换与Selenium网络驱动程序和Python,但得到以下异常: 我的HTML代码 我使用以下选择器,它是100%唯一的: 问题是什么?这是模式对话框。我尝试了许多独特的定位器,包括和,我确信这不是定位器的问题。其他人也有类似的问题吗? 我的Python代码: 谢谢

  • 简介 如何用yii2-bootstrap自带的组件tabs实现tab切换的功能,今天就用一个简单的实例以及效果演示来告诉大家如果应用tabs这个组件 演示 tab切换效果图 用法 echo Tabs::widget([ 'items' => [ [ 'label' => 'One', 'content' => 'Anim pariatur c

  • CSS :hover 实现 Tab 切换选项卡 这里我们主要使用:hover伪类选择器 与 ~ 兄弟选择器 与 nth-of-type 选择器实现 Tab 选项卡。 能实现的功能不多,假如能满足需要,使用这个方法是最简单的。 准备一下 HTML <div class="tab"> <span class="top one">1</span> <div cla

  • 问题内容: 我是React的新手,对某种基本的东西感到困惑。 我需要在单击事件后呈现DOM之后将组件添加到DOM。 我最初的尝试如下,但是没有用。但这是我想尝试的最好的方法。(预先为将jQuery与React混合使用而道歉。) 希望我已经清楚需要做什么,希望您能帮助我获得适当的解决方案。 问题答案: 正如@Alex McMillan所提到的那样,使用state来指示应在dom中呈现的内容。 在下面