如何處理React.js?中未知數量的狀態變量

我正在從服務器獲取數據。我不知道api中到底有多少項。因此,我在html中使用map方法。下面是返回部分。

   if (loading) {
    return (
      <div>
        <div>
          <Header />
          <Sidebar />
        </div>
        <h1>LOADING ...</h1>
      </div>
    );
  }
  if (error) console.log(error);
  return (
    <div>
      <div>
        <Header />
        <Sidebar />
        <h1>Menu Edit Page</h1>
        {edit === false ? (
          <div>
            <table>
              <tbody>
            {
              data?.map((item, index) => (
                <tr>
                  <td>Name: </td>
                  <td>{item?.name}</td>
                  {/* Full_Name: { item.name }, 
                User_Email: { item.email }  */}
                </tr>
              ))
            }
            </tbody>
            </table>
            <Button onClick={() => editMenu()}>edit</Button>
          </div>
        ) : (
          <div>
            <table>
              <tbody>
            {
              data?.map((item, index) => (
                <tr>
                  <td>Name: </td>
                  <input
                  type="text"
                  required="required"
                  placeholder="Edit menu item"
                  name="age"
                  defaultValue={item?.name}
                  onChange={() => itemChange(item?.class, item?.id)}
                  >
                  </input>
                  {/* {item?.name} */}
                  {/* Full_Name: { item.name }, 
                User_Email: { item.email }  */}
                </tr>
              ))
            }
            </tbody>
            </table>
            <Button onClick={() => saveMenu()}>save</Button>
          </div>
        )}
      </div>
    </div>
  )

當我對對象使用輸入標記時,我需要在單擊按鈕時操縱它們。然而,我不知道有多少個對象,所以我不能使用狀態變量。此外,當我更改對象時,我需要從對象本身了解信息。整個代碼如下。

 import React, { useState } from 'react'
import Header from "../Components/common/header/header";
import Sidebar from "../Components/common/sidebar/Sidebar";/// IGNORE THIS PAGE
import useFetch from './useFetch';
import { Button } from 'antd';
function MenuEditer() {
  const [newItem, setNewItem] = useState("")
  const [edit, setEdit] = useState(false);
  const [buttonPressed, setButtonPressed] = useState(false);
  const { data, loading, error } = useFetch("http://localhost:3001/category/deneme");

  const itemChange = async (clss, id) => {
    alert("beginning of the func");
    // while(!buttonPressed);
    // alert("button pressed");
    // if(clss === "category"){

    // }
    // if(clss === "item"){

    // }
  }
  const saveMenu = async () => {
    setButtonPressed(true);
    setEdit(false);
  }
  const editMenu = async () => {
    setEdit(true);
  }
  if (loading) {
    return (
      <div>
        <div>
          <Header />
          <Sidebar />
        </div>
        <h1>LOADING ...</h1>
      </div>
    );
  }
  if (error) console.log(error);
  return (
    <div>
      <div>
        <Header />
        <Sidebar />
        <h1>Menu Edit Page</h1>
        {edit === false ? (
          <div>
            <table>
              <tbody>
            {
              data?.map((item, index) => (
                <tr>
                  <td>Name: </td>
                  <td>{item?.name}</td>
                  {/* Full_Name: { item.name }, 
                User_Email: { item.email }  */}
                </tr>
              ))
            }
            </tbody>
            </table>
            <Button onClick={() => editMenu()}>edit</Button>
          </div>
        ) : (
          <div>
            <table>
              <tbody>
            {
              data?.map((item, index) => (
                <tr>
                  <td>Name: </td>
                  <input
                  type="text"
                  required="required"
                  placeholder="Edit menu item"
                  name="age"
                  defaultValue={item?.name}
                  onChange={() => itemChange(item?.class, item?.id)}
                  >
                  </input>
                  {/* {item?.name} */}
                  {/* Full_Name: { item.name }, 
                User_Email: { item.email }  */}
                </tr>
              ))
            }
            </tbody>
            </table>
            <Button onClick={() => saveMenu()}>save</Button>
          </div>
        )}
      </div>
    </div>
  )
}

export default MenuEditer;

如何從數組中訪問對象本身,或者在不知道數據長度的情況下使用useState鉤子?或者,我可以在onClick屬性中編寫函數語句嗎?或者,我可以在輸入表單中使用其他任何東西來訪問對象和更新的字符串嗎?這個問題可能還不清楚,但我非常感謝您的任何想法。謝謝

? 最佳回答:

可以使用對象來處理輸入數據

首先使用useEffect設置狀態的初始值

注意:確保HTML輸入的屬性name與來自API的屬性相同

const [formData, setFormData] = useState({})

useEffect(() => {
  const copy = formData
  data.forEach((item,index)=> {
   copy["item" + index] = {name: item.name, email: item.email}

    setFormData(copy)
})
}, [])

然后允許事件處理程序自動處理更改

const itemChange = (event, index) {
  const copy = formData
  const changedItem = copy["item" + index]
  changedItem[event.target.name] = event.target.value

 setFormData(copy)
  
}

在輸入元素中

<input
     type="text"
     required={true}
     placeholder="Edit menu item"
     name="age"  // make sure the name is same as the property name that comes form the api
     value={formData["item" + index].age}
     onChange={(e) => itemChange(e, index)}
 />
主站蜘蛛池模板: 国产一区二区精品久久91| 成人无码精品一区二区三区| 久久精品无码一区二区三区免费| 色综合一区二区三区| 91在线视频一区| 国产无码一区二区在线| 韩国精品一区视频在线播放| 亚洲一区中文字幕在线电影网| 武侠古典一区二区三区中文| 亚洲A∨精品一区二区三区下载 | 日韩精品无码人妻一区二区三区| 久久久av波多野一区二区| 亚洲一区二区三区AV无码| 区三区激情福利综合中文字幕在线一区 | 动漫精品专区一区二区三区不卡 | 国产精品主播一区二区| 精品一区二区三区视频| 爱爱帝国亚洲一区二区三区| 亚洲日韩AV一区二区三区中文| 国产福利91精品一区二区| 蜜桃无码一区二区三区| 亚洲午夜在线一区| 88国产精品视频一区二区三区| 免费一区二区三区| 国产在线aaa片一区二区99| 国产精品女同一区二区久久| 精品在线一区二区| 久久国产高清一区二区三区| 久久国产高清一区二区三区| 日本不卡一区二区三区视频| 久久中文字幕一区二区| 亚洲一区二区中文| 亚洲av成人一区二区三区| 国产精品香蕉在线一区| 亚洲无码一区二区三区| 国产一区二区三区在线观看免费| 精彩视频一区二区三区| 免费萌白酱国产一区二区三区| 日本不卡一区二区三区| 午夜福利无码一区二区| 日韩国产一区二区|