我还是个新手.我正在try 创建登录/注册屏幕.我有三个组件,分别称为Login、Register和SlidingCard.我在另一个名为Screen的JSX文件中呈现这些组件.在SlidingCard.jsx中,我有一个div,在这个div中有一些文本和按钮.当我点击按钮时,文本和按钮从注册相关的东西更改为登录相关的东西.现在我要说的是.我提到过,当我点击SlidingCard上的按钮时,文本会发生变化.但与那个点击,我想呈现的登录或注册.我该怎么做呢?

登录.jsx

import React from "react";
import Input from "./Input";

function Login() {
  return (
    <div className="loginContainer">
      <div className="loginChildContainer">
        <h1>Welcome Back!</h1>
        <p>Lorem lorem lorem lorem lorem</p>
        <Input type="text" placeholder="Username" />
        <Input type="password" placeholder="Password" />
        <button type="submit">Sign In</button>
      </div>
    </div>
  );
}

export default Login;

Register.jsx

import React from "react";
import Input from "./Input";
import FacebookIcon from "@mui/icons-material/Facebook";
import GoogleIcon from "@mui/icons-material/Google";
import TwitterIcon from "@mui/icons-material/Twitter";

function Register() {
  return (
    <div className="registerContainer">
      <h1>Create Account</h1>
      <button>
        <FacebookIcon />
      </button>
      <button>
        <GoogleIcon />
      </button>
      <button>
        <TwitterIcon />
      </button>
      <Input type="text" placeholder="Username" />
      <Input type="text" placeholder="email" />
      <Input type="password" placeholder="Password" />
      <button type="submit">Sign In</button>
    </div>
  );
}

export default Register;

SlidingCard.jsx

import React, { useState } from "react";

function SlidingCard() {
  const [isChanged, setChange] = useState(false);

  const loginPaheseTexts = {
    title: "Hello, Friend!",
    description: "Enter your personal details and start jurney with us.",
    button: "Sign Up"
  };

  const registerPhaseTexts = {
    title: "Welcome Back",
    description:
      "To keep connecting with us please login with your personal info.",
    button: "Sign In"
  };

  const texts = isChanged ? registerPhaseTexts : loginPaheseTexts;

  function handleClick(event) {
    console.log(isChanged);

    setChange(!isChanged);
  }

  return (
    <div>
      <h1>{texts.title}</h1>
      <p>{texts.description}</p>
      <button onClick={handleClick}>{texts.button}</button>
    </div>
  );
}

export default SlidingCard;

Screen.jsx

import React from "react";
import Login from "./Login";
import Register from "./Register";
import SlidingCard from "./SlidingCard";

function Screen(props) {
  return (
    <div className="appContainer">
      {props.isChanged ? <Register /> : <Login />}
      <SlidingCard />
    </div>
  );
}

我查了实习生,但我找不到我要找的东西.

推荐答案

由于您的isChanged状态在呈现Login/RegisterSlidingCard之间共享,因此您需要将该状态"提升"到它们的公共父级Screen.一旦这样做了,您就可以在Screen中直接使用isChanged,然后将它和setChange向下传递到SlidingCard.官方react 文件中的This article对这个问题进行了更多的解释.

最后,您只需更改Screen.jsxSlidingCard.jsx即可:

Screen.jsx

import React from "react";
import Login from "./Login";
import Register from "./Register";
import SlidingCard from "./SlidingCard";

function Screen(props) {
  const [isChanged, setChange] = React.useState(false);

  return (
    <div className="appContainer">
      {isChanged ? <Register /> : <Login />}
      <SlidingCard isChanged={isChanged} setChange={setChange} />
    </div>
  );
}

export default Screen;

SlidingCard.jsx

import React from "react";

function SlidingCard({isChanged, setChange}) {

  const loginPaheseTexts = {
    title: "Hello, Friend!",
    description: "Enter your personal details and start jurney with us.",
    button: "Sign Up"
  };

  const registerPhaseTexts = {
    title: "Welcome Back",
    description:
      "To keep connecting with us please login with your personal info.",
    button: "Sign In"
  };

  const texts = isChanged ? registerPhaseTexts : loginPaheseTexts;

  function handleClick(event) {
    console.log(isChanged);

    setChange(!isChanged);
  }

  return (
    <div>
      <h1>{texts.title}</h1>
      <p>{texts.description}</p>
      <button onClick={handleClick}>{texts.button}</button>
    </div>
  );
}

export default SlidingCard;

但是,您可能还应该为该州考虑一个更合适/更易读的名称,例如showLoginsetShowLogin.

Reactjs相关问答推荐

Inbox Enum类型以React组件状态时出现TypScript错误

如何使用Reducer更新全局变量

如何避免react 使用ESLINTreact 挂钩/穷举-deps进行第一次呈现

为多租户SSO登录配置Azure AD应用程序

Redux Store未触发React组件中的重新呈现

是否在Extra Reducer完成作业(job)时触发createListenerMiddleware?

使用自动播放的视频组件呈现登录页面时出现JEST测试错误

带有样式的工具提示导致无法向功能组件提供参考警告

如何在不同的路由中渲染相同的页面组件(包括 getServerSideProps)

React 无效的钩子调用:如何避免嵌套钩子?

提前输入错误:选项类型上不存在属性名称

React:如何使用条件渲染和react 挂钩来更新另一个组件的状态?

如何让 useEffect 在 React.JS 中只运行一次?

Formik onChange() 字段挂钩覆盖显示值和 Select 机制

React Native PermissionsAndroid 不包括 READ_MEDIA_IMAGES.如何解决这个问题?

useState 在生命周期中的位置

理解 React 中的 PrevState

当页面重新加载react 路由导航到第一页 v6

为什么我从另一个组件收到错误?

如何在 React x 中返回组件?