I’m new to React. I’m trying to create a Login/Register Screen. I have three components called Login, Register and SlidingCard. I render these componenets on other jsx file called Screen. In SlidingCard.jsx i have a div and inside this div there are some text and button. When i clicked the button, text and button changes to login related things from register related things. Now the part that i stucked. I mentioned that when i clicked the button on SlidingCard the text changes. But with that click i want to render the Login or Register too. How can i do it?
Login.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>
);
}
I checked the interner and i can’t find what i’m looking for.
3
Answers
Fundamentally in React, when you want to change something on the page … you don’t. Instead, you change a state variable that controls that part of the page, and then React "reacts" by updating the page for you.
So, if you want a Login component to appear, you simply make a
showLogin
state variable, wrap the component with it:and the change that variable to
true
.Since your
isChanged
state is shared between both renderingLogin/Register
andSlidingCard
, you need to "lift" that state up to their common parent,Screen
. Once you do that, you can useisChanged
directly withinScreen
, and pass it andsetChange
down toSlidingCard
. This article from the official React docs explains this issue more.In the end, you only need to change
Screen.jsx
andSlidingCard.jsx
like so:Screen.jsx
SlidingCard.jsx
However, you should also probably consider a more appropriate/readable name for the state, such as
showLogin
andsetShowLogin
.As per my comment, I have implemented my suggested changes in a code sandbox project (https://codesandbox.io/s/nostalgic-pond-dwrrnl).
Main changes are in Screen.jsx
and then get the state as props in Sliding card