You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在React中使用react-tabs时点击联系人如何切换到聊天tab面板?

问题描述

我有一个React应用,其中包含两个tabs标签页:第一个标签页展示已聊天用户列表,第二个标签页展示所有已注册联系人,标签页基础功能运行正常。现在我的需求是:当用户处于第二个标签页时,点击任意用户,自动跳转显示聊天标签页。我使用npm包react-tabs实现标签页功能。
功能示意图

现有代码

chatsection.js:已聊天组件和注册联系人组件的父组件

import React, { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import "./Style.css";
import { Tab, Tabs, TabList, TabPanel } from "react-tabs";
import "react-tabs/style/react-tabs.css";
import Allcontacts from "./Allcontacts";
import ChatedList from "./ChatedList";
import { setTabPane } from "./actions";
import "./Style.css";
const ChatSection = (props) => {
  const dispatch = useDispatch();
  const tab = useSelector((state) => state.tab);
  console.log("tab", tab);
  return (
    <div className="">
      <Tabs>
        <TabList style={{ display: "flex" }}>
          <Tab
            onClick={() => dispatch(setTabPane("chat"))}
            className={` ${tab === "chat" ? "abc" : "1"}`}
          >
            Chats
          </Tab>
          <Tab
            onClick={() => dispatch(setTabPane("contact"))}
            className={` ${tab === "contact" ? "abc" : "1"}`}
          >
            Allcontacts
          </Tab>
        </TabList>

        <TabPanel>
          <ChatedList />
        </TabPanel>
        <TabPanel>
          <Allcontacts />
        </TabPanel>
      </Tabs>
    </div>
  );
};

export default ChatSection;

chated.js

import React, { useEffect, useState } from "react";
import axios from "axios";
import ShowSingle from "./ShowSingle";
function ChatedList() {
  const [users, setUsers] = useState();
  const [loading, setLoading] = useState(true);
  useEffect(() => {
    axios
      .get("http://localhost:3005/")
      .then(function (response) {
        setUsers(response.data);
        console.log("users" + JSON.stringify(response.data));
        setLoading(false);
      })
      .catch(function (error) {
        console.log(error);
        setLoading(false);
      });
  }, []);
  return (
    <div>
      {!loading && users.map((user, id) => <ShowSingle key={id} user={user} />)}
    </div>
  );
}
export default ChatedList;

Allcontacts.js

import React, { useEffect, useState } from "react";
import "./All.css";
import ShowSingle from "./ShowSingle";
import axios from "axios";
import { useDispatch } from "react-redux";
import { setTabPane } from "./actions";
function Allcontacts() {
  const dispatch = useDispatch();

  const [users, setUsers] = useState();
  const [loading, setLoading] = useState(true);
  useEffect(() => {
    axios
      .get("http://localhost:3005/all")
      .then(function (response) {
        setUsers(response.data);
        console.log("users" + JSON.stringify(response.data));
        setLoading(false);
      })
      .catch(function (error) {
        console.log(error);
        setLoading(false);
      });
  }, []);
  const clickHandler = () => {
    dispatch(setTabPane("chat"));
  };
  return (
    <div>
      {!loading &&
        users.map((user, id) => (
          <ShowSingle key={id} user={user} click={clickHandler} />
        ))}
    </div>
  );
}

export default Allcontacts;

单个用户展示组件ShowSingle.js

import React from "react";

function ShowSingle({ user, click }) {
  return (
    <div className="wrapper">
      <ul>
        <li onClick={click}>{user.name}</li>
      </ul>
    </div>
  );
}

export default ShowSingle;
解决方案

问题核心是你只将标签状态存储在Redux中,没有和react-tabs的内置选中状态做绑定,所以Redux状态更新后标签组件不会自动切换。只需要修改ChatSection.js的代码即可:

import React, { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import "./Style.css";
import { Tab, Tabs, TabList, TabPanel } from "react-tabs";
import "react-tabs/style/react-tabs.css";
import Allcontacts from "./Allcontacts";
import ChatedList from "./ChatedList";
import { setTabPane } from "./actions";
import "./Style.css";
const ChatSection = (props) => {
  const dispatch = useDispatch();
  const tab = useSelector((state) => state.tab);
  // 将Redux的状态映射为标签组件需要的索引,第一个标签索引为0,第二个为1
  const selectedTabIndex = tab === "chat" ? 0 : 1;
  // 处理手动点击标签时的状态同步
  const handleTabChange = (index) => {
    dispatch(setTabPane(index === 0 ? "chat" : "contact"));
  };
  return (
    <div className="">
      {/* 给Tabs组件绑定选中索引和切换回调 */}
      <Tabs selectedIndex={selectedTabIndex} onSelect={handleTabChange}>
        <TabList style={{ display: "flex" }}>
          <Tab
            className={` ${tab === "chat" ? "abc" : "1"}`}
          >
            Chats
          </Tab>
          <Tab
            className={` ${tab === "contact" ? "abc" : "1"}`}
          >
            Allcontacts
          </Tab>
        </TabList>

        <TabPanel>
          <ChatedList />
        </TabPanel>
        <TabPanel>
          <Allcontacts />
        </TabPanel>
      </Tabs>
    </div>
  );
};

export default ChatSection;

补充说明

你提供的Allcontacts.js原始代码存在重复冗余的问题,删除后一段重复的相同代码即可,不影响功能运行。


内容的提问来源于stack exchange,提问作者Wani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:12:00