Home > front end >  multiple toggle button automatically turn off
multiple toggle button automatically turn off

Time:12-23

I developed multiple toggle button with this code. but I want to add function of automatically turn off

For instance, First, click "a" button to turn on, then click other button to occur automatically turn off the "a" button.

 const [Selected, setSelected] = useState({
        "a": false,
        "b": false,
        "c": false,
        "d": false,
        "e": false,
    });
const select = (e) => {
        
            setSelected({
                ...Selected,
                [e.target.value]: !Selected[e.target.value],
            });
        
    }
<button onClick={select} className={selected["a"] ? "style selected" : "style"} value="a">a</button>

<button onClick={select} className={selected["b"] ? "style selected" : "style"} value="b">b</button>

<button onClick={select} className={selected["c"] ? "style selected" : "style"} value="c">c</button>

...

It can be possible with this code? plz let me know what should I code for that, and plz suggest how to approach or something better ways

CodePudding user response:

In JS undefined is a falsy value. So selected["a"] ? "style selected" : "style" would be evaluated the same way if selected["a"] is false or `undefined.

So your initial state can actually be an empty object, and to turn all other buttons off when clicking a button, create a new empty state with only that button turned on.

const { useState } = React

const Demo = () => {
  const [selected, setSelected] = useState({});
      
  const select = (e) => {
    setSelected(() => ({
      [e.target.value]: !selected[e.target.value]
    }))
  }
  
  return (
    <div>
      <button onClick={select} className={selected["a"] ? "style selected" : "style"} value="a">a</button>

      <button onClick={select} className={selected["b"] ? "style selected" : "style"} value="b">b</button>

      <button onClick={select} className={selected["c"] ? "style selected" : "style"} value="c">c</button>
    </div>
  )
}

ReactDOM
  .createRoot(root)
  .render(<Demo />)
.selected {
  color: red;
}
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>

<div id="root"></div>

CodePudding user response:

Try this,

const select = (e) => {
    const prev_selected={...Selected};
    for(let key in prev_selected){
       prev_selected[key]= key===e.target.value;
    }
    setSelected(prev_selected);    
}
  • Related