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

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

React-hooks 在點擊時處理多個按鈕狀態

React-hooks 在點擊時處理多個按鈕狀態

HUH函數 2022-12-18 16:10:31
我的應用程序中有 5 個按鈕,我想根據按鈕狀態更改背景顏色,所以現在當我單擊一個按鈕時,它會影響所有按鈕(切換類),不僅我需要更改按鈕顏色,而且我還需要隱藏和顯示每個按鈕的數據,所以我使用條件渲染,默認選項卡是社交媒體。因此,例如,您單擊按鈕 1 它會更改背景顏色并顯示帶有信息的 div 等這是我到目前為止所擁有的    import React, { useState, useEffect, useRef } from 'react';        function Mata() {    const [isBlack, setIsBlack] = useState(0);    const [tab, setTab] = useState('socialmedia');        const handleBtn1 = (e) =>{        e.preventDefault();        setIsBlack(!isBlack);          setTab('data1);     }    const handleBtn2 = (e) =>{        e.preventDefault();        setIsBlack(!isBlack);          setTab('data2');     }    const handleBtn3 = (e) =>{        e.preventDefault();        setIsBlack(!isBlack);         setTab('data3');     }    const handleBtn4 = (e) =>{        e.preventDefault();        setIsBlack(!isBlack);          setTab('data4');     }    const handleBtn5 = (e) =>{        e.preventDefault();        setIsBlack(!isBlack);        setTab('data5');     }我需要更改什么才能使其正常工作?
查看完整描述

2 回答

?
料青山看我應如是

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

每個按鈕都需要單獨的狀態。我建議使用地圖來存儲一個按鈕 ID 和一個布爾值,以確定它是否為“黑色”,即點擊處理程序只是切換一個布爾值。我不知道這是否是將代碼復制/粘貼到 SO 時的拼寫錯誤,但需要在功能組件主體中聲明反應狀態。


const [isBlack, setIsBlack] = useState({});

您還可以通過將其轉換為柯里化回調來使用單擊處理程序,將按鈕 ID 獲取并包含在范圍內。這使用功能狀態更新來淺層復制現有狀態并更新包含的按鈕 ID 的值。


const handleBtn = btnId => e => {

  e.preventDefault();

  setIsBlack(state => ({

    ...state,

    [btnId]: !state[btnId],

  }));

};

完整代碼


function Mata() {

  const [activeTab, setActiveTab] = useState("activeTab");

  const [isBlack, setIsBlack] = useState({});


  const handleBtn = btnId => e => {

    e.preventDefault();

    setIsBlack(state => ({

      ...state,

      [btnId]: !state[btnId]

    }));

  };


  return (

    <div className="container">

      <button

        style={{ backgroundColor: isBlack["btn1"] ? "#262626" : "#F3F3F3" }}

        className={`btn1 ${isBlack["btn1"] && activeTab}`}

        onClick={handleBtn("btn1")}

      >

        btn1

      </button>

      <button

        style={{ backgroundColor: isBlack["btn2"] ? "#262626" : "#F3F3F3" }}

        className={`btn2 ${isBlack["btn2"] && activeTab}`}

        onClick={handleBtn("btn2")}

      >

        btn2

      </button>

      <button

        style={{ backgroundColor: isBlack["btn3"] ? "#262626" : "#F3F3F3" }}

        className={`btn3 ${isBlack["btn3"] && activeTab}`}

        onClick={handleBtn("btn3")}

      >

        btn3

      </button>

      <button

        style={{ backgroundColor: isBlack["btn4"] ? "#262626" : "#F3F3F3" }}

        className={`btn4 ${isBlack["btn4"] && activeTab}`}

        onClick={handleBtn("btn4")}

      >

        btn4

      </button>

      <button

        style={{ backgroundColor: isBlack["btn5"] ? "#262626" : "#F3F3F3" }}

        className={`btn5 ${isBlack["btn5"] && activeTab}`}

        onClick={handleBtn("btn5")}

      >

        btn5

      </button>

    </div>

  );

}

有很多重復的代碼,所以一個更干的版本,其中活動選項卡和按鈕作為道具傳遞。


function Mata({ activeTab = '', buttons }) {

  const [isBlack, setIsBlack] = useState({});


  const handleBtn = btnId => e => {

    e.preventDefault();

    setIsBlack(state => ({

      ...state,

      [btnId]: !state[btnId]

    }));

  };


  return (

    <div className="container">

      {buttons.map(btn => (

        <button

          style={{ backgroundColor: isBlack[btn] ? "#262626" : "#F3F3F3" }}

          className={`btn1 ${isBlack[btn] && activeTab}`}

          onClick={handleBtn(btn)}

        >

          {btn}

        </button>

      ))}

    </div>

  );

}

像這樣使用


const buttons = ["btn1", "btn2", "btn3", "btn4", "btn5"];


...


<Mata buttons={buttons} />

編輯

似乎你真的在創建一個“標簽管理器”。我建議將狀態放樣到父級并轉換Mata為只呈現“選項卡”按鈕的“啞”組件。采用 3 個道具:活動選項卡索引、按鈕數組和狀態更新回調。


function Mata({ activeTab = -1, buttons, setActiveTab }) {

  return (

    <div className="container">

      {buttons.map((btn, i) => {

        const isActive = i === activeTab;

        return (

          <button

            key={btn.id}

            style={{ backgroundColor: isActive ? "#262626" : "#F3F3F3" }}

            className={`${btn.id} ${isActive && activeTab}`}

            onClick={() => setActiveTab(i)}

          >

            {btn.id}

          </button>

        );

      })}

    </div>

  );

}

示例選項卡數據


const tabs = [

  { id: "btn1", data: "data1" },

  { id: "btn2", data: "data2" },

  { id: "btn3", data: "data3" },

  { id: "btn4", data: "data4" },

  { id: "btn5", data: "data5" }

];

用法示例


<Mata activeTab={activeTab} buttons={tabs} setActiveTab={setActiveTab} />


{activeTab === -1 ? (

  <div>Social Media</div>

) : (

  <div>{tabs[activeTab].data}</div>

)}

添加“圖標”

類似于在運行時選擇類型


如果 SVG 圖標還不是反應組件,將它們包裝成一個簡單的功能組件


const Icon1 = () => <svg>...</svg>;

在標簽數據中添加一個圖標字段并將值設置為圖標組件


const tabs = [

  { id: "btn1", data: "data1", icon: Icon1 },

  { id: "btn2", data: "data2", icon: Icon2 },

  { id: "btn3", data: "data3", icon: Icon3 },

  { id: "btn4", data: "data4", icon: Icon4 },

  { id: "btn5", data: "data5", icon: Icon5 }

];

并解構并重命名以呈現


function Mata({ activeTab = -1, buttons, setActiveTab }) {

  return (

    <div className="container">

      {buttons.map((btn, i) => {

        const isActive = i === activeTab;

        const { icon: Icon, id } = btn; // <-- rename icon -> Icon


        return (

          <button

            key={id}

            style={{ backgroundColor: isActive ? "#262626" : "#F3F3F3" }}

            className={`${id} ${isActive && activeTab}`}

            onClick={() => setActiveTab(i)}

          >

            <Icon /> {id} // <-- render icon component

          </button>

        );

      })}

    </div>

  );

}


查看完整回答
反對 回復 2022-12-18
?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

你為什么做這個


const [isBlack, setIsBlack] = useState(0);

而不是這樣做?


const [isBlack, setIsBlack] = useState(false);

另外,要使用 useState,您必須像下面這樣編輯代碼,因為掛鉤只能在函數組件的主體內部調用。


import React, { useState, useEffect, useRef } from "react";


function Mata() {

  const [isBlack, setIsBlack] = useState(false); // correction here


  const handleBtn1 = e => {

    e.preventDefault();

    setIsBlack(!isBlack);

  };

  const handleBtn2 = e => {

    e.preventDefault();

    setIsBlack(!isBlack);

  };

  const handleBtn3 = e => {

    e.preventDefault();

    setIsBlack(!isBlack);

  };

  const handleBtn4 = e => {

    e.preventDefault();

    setIsBlack(!isBlack);

  };

  const handleBtn5 = e => {

    e.preventDefault();

    setIsBlack(!isBlack);

  };

  return (

    <div className="container">

      <button

        style={{ backgroundColor: isBlack ? "#262626" : "#F3F3F3" }}

        className={`btn1 ${isBlack && activeTab}`}

        onClick={handleBtn1}

      >

        btn1

      </button>

      <button

        style={{ backgroundColor: isBlack ? "#262626" : "#F3F3F3" }}

        className={`btn2 ${isBlack && activeTab}`}

        onClick={handleBtn2}

      >

        btn2

      </button>

      <button

        style={{ backgroundColor: isBlack ? "#262626" : "#F3F3F3" }}

        className={`btn3 ${isBlack && activeTab}`}

        onClick={handleBtn3}

      >

        btn3

      </button>

      <button

        style={{ backgroundColor: isBlack ? "#262626" : "#F3F3F3" }}

        className={`btn4 ${isBlack && activeTab}`}

        onClick={handleBtn4}

      >

        btn4

      </button>

      <button

        style={{ backgroundColor: isBlack ? "#262626" : "#F3F3F3" }}

        className={`btn5 ${isBlack && activeTab}`}

        onClick={handleBtn5}

      >

        btn5

      </button>

    </div>

  );

}


export default Mata;



查看完整回答
反對 回復 2022-12-18
  • 2 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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