Reputation: 1694
I am trying to have 3 buttons that toggle their active state based on if the others are clicked.
So if button 1 is active, button 2 and 3 should not be. My buttons are arranged in the following way.
<ButtonClickable3 name="Medium" value="10" onClick={(event) => addPizza(event)}></ButtonClickable3>
<ButtonClickable3 name="Large" value="15" onClick={(event) => addPizza(event)}></ButtonClickable3>
<ButtonClickable3 name="Extra Large" value="20" onClick={(event) => addPizza(event)}></ButtonClickable3>
And the component is this
const ButtonClickable3 = (props) => {
const [isActive, setActive] = useState("false");
const handleToggle = (e) => {
setActive(!isActive);
props.onClick(e)
};
return <button
type="button"
value={props.value}
name={props.name}
className={isActive ? "button btn fourth" : "button btn fourthActive"}
onClick={handleToggle}
>
{props.name}
</button>
}
Currently the only thing I can accomplish is having all the buttons turn on and off together. I.E. One is clicked and they all change active state.
How am I able to make only one be active at a time?
I have put my code in a codesanbox
here Thank you for your help.
Upvotes: 0
Views: 1619
Reputation: 2804
The state for the buttons needs to be moved from the ButtonClickable3 component up to the parent.
So you would have something like
const [selectedPizzaSize, setSelectedPizzaSize] = useState()
Then pass in a selected
prop to the components themselves
<ButtonClickable3 name="Medium" value="10" selected={selectedPizzaSize === "10"} onClick={(event) => addPizza(event)}></ButtonClickable3>
<ButtonClickable3 name="Large" value="15" selected={selectedPizzaSize === "15"} onClick={(event) => addPizza(event)}></ButtonClickable3>
<ButtonClickable3 name="Extra Large" value="20" selected={selectedPizzaSize === "20"} onClick={(event) => addPizza(event)}></ButtonClickable3>
You'll need to call setSelectedPizzaSize
inside your addPizza
function
Upvotes: 1