简体   繁体   中英

I created collapse in React, I used different useState for each click, but I want to use only one useState

    function Solution() {
    const [firstClick,setFirstClick] = useState(true);
    const [secondClick,setSecondClick] = useState(true);
    const [thirdClick,setThirdClick] = useState(true);
    const [fourthClick,setFourthClick] = useState(true);
    const [fivethClick,setFivethClick] = useState(true);
    const [sixthClick,setSixthClick] = useState(true);
    const [seventhClick,setSeventhClick] = useState(true);

    const changeIconFirst = () => {
    firstClick ? setFirstClick(false) : setFirstClick(true);
    setSecondClick(true);
    setThirdClick(true);
    setFourthClick(true);
    setFivethClick(true);
    setSixthClick(true);
    setSeventhClick(true)

    }
    const changeIconSecond = () => {
    secondClick ? setSecondClick(false) : setSecondClick(true);
    setFirstClick(true);
    setThirdClick(true);
    setFourthClick(true);
    setFivethClick(true);
    setSixthClick(true);
    setSeventhClick(true)
    }
    const changeIconThird = () => {
    thirdClick ? setThirdClick(false) : setThirdClick(true);
    setFirstClick(true);
    setSecondClick(true);
    setFourthClick(true);
    setFivethClick(true);
    setSixthClick(true);
    setSeventhClick(true)
    }
    const changeIconFourth = () => {
    fourthClick ? setFourthClick(false) : setFourthClick(true);
    setFirstClick(true);
    setSecondClick(true);
    setThirdClick(true);
    setFivethClick(true);
    setSixthClick(true);
    setSeventhClick(true)
    }
    const changeIconFiveth = () => {
    fivethClick ? setFivethClick(false) : setFivethClick(true);
    setFirstClick(true);
    setSecondClick(true);
    setThirdClick(true);
    setFourthClick(true);
    setSixthClick(true);
    setSeventhClick(true)
    }
    const changeIconSixth = () => {
    sixthClick ? setSixthClick(false) : setSixthClick(true);
    setFirstClick(true);
    setSecondClick(true);
    setThirdClick(true);
    setFourthClick(true);
    setFivethClick(true);
    setSeventhClick(true)
    }
    const changeIconSeventh = () => {
    seventhClick ? setSeventhClick(false) : setSeventhClick(true);
    setFirstClick(true);
    setSecondClick(true);
    setThirdClick(true);
    setFourthClick(true);
    setFivethClick(true);
    setSixthClick(true);
    }

I used more than one useState to open collapse when I clicked it, but I want to set up a simpler and more dynamic structure by using one useState instead of more than one. By doing if else with the true false method, I changed the className to enable collapse to open and close. I did not think of it in the method. I am waiting for your suggestions to create a more dynamic and simpler structure.

This code should work just fine if you have any questions go ahead and ask

 function Solution() { //this is your main useState that will take control of your collapse const [collapse, setCollapse] = useState(true); // this is your collapse button you should give it an on click event <button onClick={() =>setCollapse(;collapse)}>collapse </button>; }

Edited:

 function Solution() { const [clicks, setClicks] = useState({ firstClick: true, secondClick: true, thirdClick: true, fourthClick: true, fivethClick: true, sixthClick: true, seventhClick: true, }); const changeIconFirst = () => { setClicks({ firstClick: clicks.firstClick? true: false, secondClick: true, thirdClick: true, fourthClick: true, fivethClick: true, sixthClick: true, seventhClick: true, }); }; const changeIconSecond = () => { setClicks({ secondClick: clicks.secondClick? true: false, firstClick: true, thirdClick: true, fourthClick: true, fivethClick: true, sixthClick: true, seventhClick: true, }); }; const changeIconThird = () => { setClicks({ thirdClick: clicks.thirdClick? true: false, firstClick: true, secondClick: true, fourthClick: true, fivethClick: true, sixthClick: true, seventhClick: true, }); }; const changeIconFourth = () => { setClicks({ fourthClick: clicks.fourthClick? true: false, firstClick: true, secondClick: true, thirdClick: true, fivethClick: true, sixthClick: true, seventhClick: true, }); }; const changeIconFiveth = () => { setClicks({ fivethClick: clicks.fivethClick? true: false, firstClick: true, secondClick: true, thirdClick: true, fourthClick: true, sixthClick: true, seventhClick: true, }); }; const changeIconSixth = () => { setClicks({ sixthClick: clicks.sixthClick? true: false, firstClick: true, secondClick: true, thirdClick: true, fourthClick: true, fivethClick: true, seventhClick: true, }); }; const changeIconSeventh = () => { setClicks({ seventhClick: clicks.seventhClick? true: false, firstClick: true, secondClick: true, thirdClick: true, fourthClick: true, fivethClick: true, sixthClick: true, }); }; }

If you only want to use one single component then u can accomplish by giving each collapse a index.

in the render

<button onClick={()=> setId(1)}>Click</button> // can be 1,2,3,4,5,6,7

in your collapse it can be something like

<CollapseComponent show={id === 1} />
<CollapseComponent show={id === 2} />
<CollapseComponent show={id === 3} />

I notice the question speaks about clicking multiple times. so onClick can be changed to as follows

const onClick = () => {
     if (id === 7) { //assuming there's 8 pics
        setId(0)
     } else {
        setId(prev => prev+1)
     }
}

<button onClick={onClick}>Click</button> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM