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改成原生的也不行
SceneMap
里面的key
需要initialTabState
里面routes
每一项的key
对应,然后你掉onTabPress 就可以了
从你提供的代码来看,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中呈现的内容。 在下面