REECT复选框:警告:组件正在更改受控输入以无法控制的输入

发布于 2025-02-07 04:44:47 字数 2726 浏览 2 评论 0原文

我正在为电子商务产品功能实施性别选择复选框。

  1. GENDERSLIST =来自后端API
  2. PDTGENDERS的可用性别列表=适用的客户性别,因为该产品

将FailSafe和Checks and Balances置于适当的位置,但它总是在抛出错误 - 组件正在更改受控输入,以无法控制。

以下是实现相同的JSX代码:

const GenderSelect = ({
  heading,
  setResStatus,
  setResMessage,
  pdtGenders,
  setPdtGenders,
}) => {
  // genderList = Master list of all genders in database
  const [genderList, setGenderList] = useState([]);

  // Step 1: Populating genderList from API
  useEffect(() => {
    getAllGendersList()
      .then((response) => {
        setGenderList(response.data.genders);
      })
      .catch((error) => {
        setResStatus(error.response.statusText);
        setResMessage(error.response.data.message);
      });
  }, [setResMessage, setResStatus]);

  // Applicable genders for the product will be stored in pdtGenders
  // pdtGenders = {id: 1, name: 'Male'}
  // genderList = [{id: 1, name: 'Male'}, {id: 2, name: 'Female'}, {id: 3, name: 'Unisex'}]

  const handleCheckboxChange = (event, listItem) => {
    event.target.checked
      ? setPdtGenders((prevState) => {
          let newState = [...prevState];
          newState.push(listItem);
          return newState;
        })
      : setPdtGenders((prevState) => {
          let newState = [...prevState];
          newState = newState.filter((item) => item.name !== listItem.name);
          return newState;
        });
  };

  console.log('genderList', genderList);
  console.log('pdtGenders', pdtGenders);
  return (
    <div className="grid grid-cols-4 gap-4 pb-1">
      <h4 className="col-span-1 text-sm font-semibold text-gray-600">
        {heading}
      </h4>
      <ul className="col-span-3 flex items-end gap-4">
        {genderList &&
          genderList.length > 0 &&
          genderList.map((listItem, index) => (
            <li key={index}>
              <input
                type="checkbox"
                id={listItem.id}
                name="genders"
                className="mr-2 cursor-pointer"
                checked={
                  pdtGenders
                    ? pdtGenders.length > 0
                      ? pdtGenders.find((item) => item.name === listItem.name)
                      : false
                    : false
                }
                onChange={(event) => handleCheckboxChange(event, listItem)}
              />
              <label htmlFor={listItem.id} className="text-sm cursor-pointer">
                {listItem.name}
              </label>
            </li>
          ))}
      </ul>
    </div>
  );
};

export default GenderSelect;

I'm implementing a gender selection checkbox for an ecommerce product features.

  1. Genderslist = List of available genders coming from the backend API
  2. pdtGenders = Applicable customer genders for the product

Inspite of putting the failsafe and checks and balances in place, it is always throwing error - component is changing controlled input to be uncontrolled.

The below is the jsx code implementing the same:

const GenderSelect = ({
  heading,
  setResStatus,
  setResMessage,
  pdtGenders,
  setPdtGenders,
}) => {
  // genderList = Master list of all genders in database
  const [genderList, setGenderList] = useState([]);

  // Step 1: Populating genderList from API
  useEffect(() => {
    getAllGendersList()
      .then((response) => {
        setGenderList(response.data.genders);
      })
      .catch((error) => {
        setResStatus(error.response.statusText);
        setResMessage(error.response.data.message);
      });
  }, [setResMessage, setResStatus]);

  // Applicable genders for the product will be stored in pdtGenders
  // pdtGenders = {id: 1, name: 'Male'}
  // genderList = [{id: 1, name: 'Male'}, {id: 2, name: 'Female'}, {id: 3, name: 'Unisex'}]

  const handleCheckboxChange = (event, listItem) => {
    event.target.checked
      ? setPdtGenders((prevState) => {
          let newState = [...prevState];
          newState.push(listItem);
          return newState;
        })
      : setPdtGenders((prevState) => {
          let newState = [...prevState];
          newState = newState.filter((item) => item.name !== listItem.name);
          return newState;
        });
  };

  console.log('genderList', genderList);
  console.log('pdtGenders', pdtGenders);
  return (
    <div className="grid grid-cols-4 gap-4 pb-1">
      <h4 className="col-span-1 text-sm font-semibold text-gray-600">
        {heading}
      </h4>
      <ul className="col-span-3 flex items-end gap-4">
        {genderList &&
          genderList.length > 0 &&
          genderList.map((listItem, index) => (
            <li key={index}>
              <input
                type="checkbox"
                id={listItem.id}
                name="genders"
                className="mr-2 cursor-pointer"
                checked={
                  pdtGenders
                    ? pdtGenders.length > 0
                      ? pdtGenders.find((item) => item.name === listItem.name)
                      : false
                    : false
                }
                onChange={(event) => handleCheckboxChange(event, listItem)}
              />
              <label htmlFor={listItem.id} className="text-sm cursor-pointer">
                {listItem.name}
              </label>
            </li>
          ))}
      </ul>
    </div>
  );
};

export default GenderSelect;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暮色兮凉城 2025-02-14 04:44:49

您可以通过默认检查道具而不是检查

You can pass defaultChecked Prop instead of checked

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文