Reputation: 1
I start learning in React.js now. But I have some problem to sent props and event from parent to child In this workshop I want to click "Turn on All" and "Turn Off All" from parent and effect to child I can do this but in child have problem to set own state to turn on or off How can I set in child to do that ?
This is my code
App.js
import React,{useState} from 'react'
import './App.css'
import Lightbox from "./Lightbox"
function App() {
const [OnOff, setOnOff] = useState(true)
return (
<div className="container">
<div className="row mt-4 mb-4">
<div className="col-md-12 text-center">
<button onClick={()=>setOnOff(true)}>Turn On All</button>
<button onClick={()=>setOnOff(false)}>Turn Off All</button>
</div>
</div>
<div className="row">
<Lightbox status={OnOff} />
<Lightbox status={OnOff} />
<Lightbox status={OnOff} />
<Lightbox status={OnOff} />
<Lightbox status={OnOff} />
</div>
</div>
);
}
export default App;
Lightbox.js
import React,{useState, useEffect } from 'react'
function Lightbox({status}) {
const [data, setdata] = useState(true)
const toggleHandler = () => setdata(!data)
useEffect(() => {
setdata(status)
})
return (
<div className={`card col-md-2 m-2 p-3 ${data?'bg-warning':'bg-dark'}`}>
{data?<div className="text-center mb-3 text-white">Light On</div>:<div className="text-center mb-3 text-white">Light Off</div>}
<button onClick={toggleHandler}>{data?"OFF":"ON"}</button>
</div>
)
}
export default Lightbox
Thank for help
https://i.sstatic.net/wp5Xb.jpg
https://i.sstatic.net/DcMxL.jpg
Upvotes: 0
Views: 69
Reputation: 2363
you have issues with the useEffect.
import React, { useState, useEffect } from "react";
function Lightbox({ status }) {
const [data, setdata] = useState(true);
const toggleHandler = () => {
setdata((data) => !data);
};
useEffect(() => {
setdata(status);
}, [status]);
return (
<div className={`card col-md-2 m-2 p-3 ${data ? "bg-warning" : "bg-dark"}`}>
{data ? (
<div className="text-center mb-3 text-white">Light On</div>
) : (
<div className="text-center mb-3 text-white">Light Off</div>
)}
<button onClick={toggleHandler}>{data ? "OFF" : "ON"}</button>
</div>
);
}
export default Lightbox;
Upvotes: 1
Reputation: 381
{data?"OFF":"ON"}
In this part, you return the value but you don't set anything. You can use
{data?setData("OFF"): setDate("ON");}
to set the values.
Also, you should add the change in props within the "useEffect" hook.
Upvotes: 0
Reputation: 1
@Mohammad Faisal
Not working on child
import React,{useState, useEffect } from 'react'
function Lightbox({status}) {
const [data, setdata] = useState(true)
const toggleHandler = () => setdata(data => !data )
useEffect(() => {
setdata(data)
})
return (
<div className={`card col-md-2 m-2 p-3 ${status?'bg-warning':'bg-dark'}`}>
{status?<div className="text-center mb-3 text-white">Light On</div>:<div className="text-center mb-3 text-white">Light Off</div>}
<button onClick={toggleHandler}>{status?"OFF":"ON"}</button>
</div>
)
}
export default Lightbox
Upvotes: 0