在 React 中为两个不同的页面制作选项卡

making tabs in react for two different pages

提问人:Hazal Kaya 提问时间:8/30/2022 最后编辑:Hazal Kaya 更新时间:9/1/2022 访问量:1155

问:

我正在尝试在 reactjs 中制作选项卡,但做不到

我想要的是登录页面和注册页面之间有选项卡

这两个页面都有一个单独的组件

我知道我错过了一些东西,但不确定它在哪里

这是我的代码

import React, { useState } from "react";
import Login from "./Login";
import SignUp from "./SignUp";

const Tabs = () => {
  const [login, setLogin] = useState(true);
  const [signup, setSignUp] = useState(true);

  const handleLogin = () => {
    setLogin(true);
    setSignUp(false);
  };

  return (
    <>
      <div className="tabs">
        <button onClick={() => setLogin(true)}> Üyelik Girişi</button>
        <button onClick={() => setLogin(false)}>Yeni Uyelik</button>
        {signup && <SignUp />}
        {/* {login && <Login />} */}
      </div>
    </>
  );
};

export default Tabs;

所以,我无法弄清楚的是,如何将函数定向到所需的页面

reactjs 反应标签

评论

0赞 yanir midler 8/30/2022
您的问题不清楚,请添加更多代码或代码笔。

答:

1赞 Yasin Tazeoglu 8/30/2022 #1

你的问题有点绝对,但我尽可能多地回答。

我认为您正在使用 react-router,您可以使用 react-router useNavigate 钩子。

它看起来像

const navigate = useNavigate();
const handleLogin = ()=> {
  navigate('/login');
};

如果你没有使用 react-router 并通过状态管理路由;

它看起来像

const handleLogin = ()=> {
  setLogin(true);
  setSignup(false);
};

// do something for signup hanlder


return (
  <div>
     {
      // your tab buttons
     }
    {signup && <SignupPage />}
    {login && <LoginPage />}
  </div>
)

评论

0赞 Hazal Kaya 8/30/2022
谢谢你的回答,我正在使用路由器,它运行良好,但他们要求我使用需要成为状态的选项卡来做到这一点
0赞 Hazal Kaya 8/30/2022
你能检查一下我编辑的代码吗?
0赞 Hazal Kaya 9/1/2022
您的代码运行良好,但它将两个组件呈现在彼此之下!
0赞 Hazal Kaya 9/1/2022
你能检查一下我编辑的代码吗?
0赞 Yasin Tazeoglu 9/1/2022
我有点困惑。“你的代码运行良好,但它将两个组件呈现在彼此之下!”是什么意思?
0赞 Alpha 8/30/2022 #2

如果你想使用状态来实现这种行为,你可以做这样的事情。我在代码中添加了注释,以便您更好地理解代码。

const App = () => {

  // depending upon this state you can show different JSX
  const [pageIndex, setPageIndex] = useState(0);

  /// function that return JSX FOR LOGIN
  const handleLoginJSX = () => {
    return <div>... login JSX </div>;
  };

  /// function that return JSX FOR SINGUP
  const handleSingUpJSX = () => {
    return <div>... sing up JSX </div>;
  };


  return (
    <div>
      {/* tab code */}
      <ul>
        <li onClick={() => setPageIndex(0)}>Login </li>
        <li onClick={() => setPageIndex(1)}>Sing up</li>
      </ul>
      {/* tab code end */}

      {/* YOUR JSX */}
      {pageIndex == 0 ? handleLoginJSX() : handleSingUpJSX()}
      {/* YOUR JSX  END*/}
    </div>
  );
}; 
0赞 David-T-John 8/30/2022 #3

你所指的概念称为路由。在 React 中添加多个“页面”或“视图”的最佳方法是使用预构建的库,即 而不是那样处理它。react-router-dom

然后,您可以使用元素将您路由到不同的页面(例如,从导航到 ),它将保留浏览器历史记录,以便您的用户可以像您期望的那样使用后退和前进按钮。Linkyoursite.com/loginyoursite.com/signup

在此处查看此库的文档:https://reactrouter.com/en/main/getting-started/tutorial

0赞 Hazal Kaya 9/1/2022 #4

所以,这段代码对我来说效果很好 将两个组件呈现在彼此之下的问题是因为在 App.js 中使用路由器

在我删除它之后,它对我来说工作正常

import { Tab, Tabs, TabList, TabPanel } from "react-tabs";
// import "react-tabs/style/react-tabs.css";
import "./Tabs.css";
import React from "react";
import Login from "./Login";
import SignUp from "./SignUp";

const LoginTabs = () => {
  return (
    <>
      <Tabs>
        <TabList>
          <Tab>Üyelik Girişi</Tab>
          <Tab>Yeni Üyelik</Tab>
        </TabList>

        <TabPanel>
          <h2>
            {" "}
            <Login />{" "}
          </h2>
        </TabPanel>
        <TabPanel>
          <h2>
            {" "}
            <SignUp />{" "}
          </h2>
        </TabPanel>
      </Tabs>
    </>
  );
};

export default LoginTabs;