亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 React 中使用 useState 或條件渲染隱藏和顯示組件?

如何在 React 中使用 useState 或條件渲染隱藏和顯示組件?

陪伴而非守候 2023-11-02 22:47:04
我最初的目標要解決:我有 4 個組件并排排列。我希望能夠切換/單擊其中一個組件并使其他 3 個組件消失。然后重新切換同一組件以使其他組件重新出現。但也能夠通過切換任何其他組件來完成相同的任務。簡單來說,每個組件都是一個 div 標簽,其中包含一個圖像標簽。我對這個問題的初步看法:export const Test = () => {    const intialValue = [{id: 0, component: null}]    const array = [                    {id: 1, component: <CompOne/>},                     {id: 2, component: <CompTwo/>},                     {id: 3, component: <CompThree/>},                     {id: 4, component: <CompFour/>}                  ]        const [chosenNumber, setChosen] = useState(0)    const [statearray, setArray] = useState(array)    useEffect(() => {        console.log(chosenNumber)        const arr = array        if(chosenNumber === 0 ) setArray(array)        else setArray(arr.filter( num => num === chosenNumber))    }, [chosenNumber])    const handleClick = (number) => {        if(number === chosenNumber) setChosen(0)        else setChosen(number)    }        return (            <div className="flex" >                {statearray.map((comp, number) => <div key={number} className="h-12 w-12 bg-gray-400 m-1 flex items-center justify-center" onClick={() => handleClick(comp.id)}>{comp.id}</div>)}            </div>        );}我的思考過程是,當我單擊組件(div)時,我將設置選擇的編號,如果我單擊的div與選擇的相同,則將選擇重置為零。每次 selectedNumber 發生變化時,useEffect 都應該檢測到它并用 selectedNumber 過濾數組,如果 Choose 為零,則重置 stateArray?,F在,當我單擊其中一個組件時,它們都會消失。我只是不確定使用零是否適合用來比較每個對象或我需要使用什么。
查看完整描述

3 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

如果我是你,我會簡化事情。首先,我將從array組件中提取內容,因為您不希望每次重新渲染組件時都重新渲染該組件。然后,我會更改您的狀態并僅保留items將包含array項目的狀態。我還會array通過提供一個 flag 來擴展這些項目isVisible。然后,我將刪除您的useEffect并改進您的handleClick,因為您只想在單擊按鈕時觸發此操作。在該函數中,我將通過映射您的項目并將“未單擊”項目更改為 false 來handleClick創建一組新項目。這樣,您就知道要隱藏哪些項目。最后,我將根據屬性渲染組件。因此,如果為 true,則該項目將被設置為渲染,反之亦然。itemsisVisibleisVisibleisVisiblehiddenfalse


這樣代碼就更加簡單、性能更高并且更容易理解。另外,它執行了您所要求的操作。


這是示例工作代碼的鏈接:codesandbox


import React, { useState } from "react";


const Comp1 = () => <div>hi</div>;

const Comp2 = () => <div>hi2</div>;

const Comp3 = () => <div>hi3</div>;


const array = [

  { id: 1, component: <Comp1 />, isVisible: true },

  { id: 2, component: <Comp2 />, isVisible: true },

  { id: 3, component: <Comp3 />, isVisible: true }

];


export const Test = () => {

  const [items, setItems] = useState(array);


  const handleClick = (number) => {

    const triggeredItems = items.map((item) => {

      if (item.id !== number) {

        item.isVisible = !item.isVisible;

      }


      return item;

    });


    setItems(triggeredItems);

  };


  return (

    <div className="flex">

      {items.map(({ id, component, isVisible }) => (

        <div

          key={id}

          className="h-12 w-12 bg-gray-400 m-1 flex items-center justify-center"

          onClick={() => handleClick(id)}

          hidden={!isVisible}

        >

          {component}

        </div>

      ))}

    </div>

  );

};


export default Test;


查看完整回答
反對 回復 2023-11-02
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

const [currentComponent, setCurrentComponent] = useState(1);


const handleClick = () =>{

    switch(currentComponent){

        case 1:

            setCurrentComponent(2)

        case 2:

            setCurrentComponent(3)

        case 3:

            setCurrentComponent(4)

        case 4:

            setCurrentComponent(1)


    }

}



<button onClick={()=> handleClick()}>Click me!</button>



{currentComponent == 1 && <Comp1/>};

{currentComponent == 2 && <Comp2/>};

{currentComponent == 3 && <Comp3/>};

{currentComponent == 4 && <Comp4/>};


查看完整回答
反對 回復 2023-11-02
?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

一種簡單的方法是在 useState 或 mobx 等狀態中保存一個布爾值(例如 isVisible = true )。然后在 React 組件中,您可以使用雙 & 符號,如下所示:

{isVisible && <MyComponent/>}

這將僅顯示 isVisible = true


查看完整回答
反對 回復 2023-11-02
  • 3 回答
  • 0 關注
  • 294 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號