简体   繁体   English

我在使用选择菜单更新状态时遇到问题

[英]I'm having trouble updating state with a select menu

As the title suggests, I'm having issues updating state with a select menu.正如标题所示,我在使用选择菜单更新状态时遇到问题。 I'm not sure if the trouble is coming from the fact I'm trying to update it from multiple sources?我不确定问题是否来自我试图从多个来源更新它的事实?

getSurvivorPerks fetches an array of objects. getSurvivorPerks 获取对象数组。 On page load a random 4 are selected to be displayed, and these four are randomized on each handlesubmit.在页面加载时,随机选择 4 个来显示,并且这四个在每个句柄提交时都是随机的。 I would like to be able to manually select the individual perks for perk1, 2, etc with a select menu.我希望能够通过选择菜单手动选择 perk1、2 等的各个特权。 As of now, this just results in perk1 getting set to Null.到目前为止,这只会导致 perk1 设置为 Null。 The data does display appropriately in the select menu.数据确实显示在选择菜单中。

export default function SurvivorRandomizer() {
  const [survivorPerk1, setSurvivorPerk1] = useState({});
  const [survivorPerk2, setSurvivorPerk2] = useState({});
  const [survivorPerk3, setSurvivorPerk3] = useState({});
  const [survivorPerk4, setSurvivorPerk4] = useState({});
  const [perkList, setPerkList] = useState([]);
  const [loading, setLoading] = useState(true);
  const { user } = useUser();

  useEffect(() => {
    const fetchData = async () => {
      const data = await getSurvivorPerks();
      let perks = randomPerks(data);
      setPerkList(data);
      setSurvivorPerk1(perks[0]);
      setSurvivorPerk2(perks[1]);
      setSurvivorPerk3(perks[2]);
      setSurvivorPerk4(perks[3]);
      setLoading(false);
    };
    fetchData();
  }, []);

  const handleSubmit = () => {
    let perks = randomPerks(perkList);
    setSurvivorPerk1(perks[0]);
    setSurvivorPerk2(perks[1]);
    setSurvivorPerk3(perks[2]);
    setSurvivorPerk4(perks[3]);
  };

 if (loading) return <h1>loading...</h1>;
  return (
    <>
      <div className="perk-row-1">
        <div className="perk-card">
          <PerkCard {...survivorPerk1} />
          <select value={perkList.perk} onChange={(e) => setSurvivorPerk1(e.target.value)}>
            <option>Select...</option>
            {perkList.map((perk) => (
              <option key={uuid()} value={perk}>
                {perk.name}
              </option>
            ))}
          </select>
        </div>

The issue here (had my blinders on) is that the value cannot be an object.这里的问题(我的眼罩)是该值不能是一个对象。

 const handlePerkSelect = async (perk, id) => {
    let setPerk = await getSurvivorPerkById(id);
    perk(setPerk);
  };

-------------
          <select onChange={(e) => handlePerkSelect(setSurvivorPerk1, e.target.value)}>
            <option>Select...</option>
            {perkList.map((perk) => (
              <option key={uuid()} value={perk.ID}>
                {perk.name}
              </option>
            ))}
          </select>

This was my solution.这是我的解决方案。 There's definitely a better way to do it that doesn't involve making more fetch requests, and I'll likely refactor, but on the off chance this helps someone, I figured I'd share what the issue was.肯定有一种更好的方法来做到这一点,它不涉及发出更多的获取请求,我可能会重构,但如果这对某人有帮助,我想我会分享问题所在。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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