【问题标题】:React Jsx checked property got overrideReact Jsx 检查属性被覆盖
【发布时间】:2022-01-19 00:28:39
【问题描述】:

我在这里尝试制作一个复选框,以便能够选择和重置。 *既然是弹窗,应该可以通过点击更新,而不是重新渲染后。

最初,当我在 UserListElement.tsx 中将“已选中”设置为 { checked } 时,复选框能够正常选中。但是我也需要一个重置功能,所以我添加了 isReset 属性并将 UserListElement.tsx 中的“已检查”值更改为{handleOnCheck}

现在选中后,单选按钮将被取消选择

但是当我点击“重置”时,之前选择的项目现在似乎已被选中,而所有内容都应该被取消选中 (false)。

感谢您的所有帮助。

UserList.tsx

export const UserList = (props: {
    showsUserList: boolean;handleClose: () => void;corporationId: string;currentUserId: string;samePerson: boolean;twj: string;
  }) => {
    const [isReset, setReset] = useState(false);
    .......
    const resetAll = () => {
      setReset(true);
      setCount((addedUserList.length = 0));
      setAddedUserList([]);
      setUserName('');
    };
    ......
    return ( <
      > < div > xxxxx <
      ul className = {
        `option-module-list no-list option-module-list-member ${style.personListMember}`
      } > {searchedUserList.map((user, i) => ( 
      <UserListElement user = { user }
          handleOnMemberClicked = { handleOnMemberClicked }
          isReset = { isReset }
          key = {i} />
        )) }
        </ul> 
      /div>
    <a className="is-secondary reservation-popup-filter-reset" onClick={resetAll}>
      .....
    }

UserListElement.tsx

export const UserListElement = ({
  user,
  handleOnMemberClicked,
  isReset,
}: {
  user: UserDetail;
  handleOnMemberClicked: (checked: boolean, userId: string | null) => void;
  isReset: boolean;
}) => {
  const [checked, setChecked] = useState(false);
  const handleOnChange = (e: ChangeEvent<HTMLInputElement>) => {
    const checkedState = e.target.checked;
    setChecked(checkedState);
    handleOnMemberClicked(checkedState, user.userId);
  };
  const handleOnCheck = useMemo(() => {
    if (isReset) {
      setChecked(false);
    }
    return checked;
  }, [isReset]);
  return (
    <li>
      <label className={style.checkboxLabel}>
        <input type="checkbox" className={style.checkboxCircle} checked={handleOnCheck} onChange={(e) => handleOnChange(e)} />
        <span>{user.name}</span>
      </label>
    </li>
  );
};

【问题讨论】:

    标签: javascript reactjs checkbox react-hooks use-effect


    【解决方案1】:

    您的问题是您在 useMemo 中返回已检查变量的旧值(返回时检查状态尚未更新)。我将消除 useMemo 以及 handleOnCheck 变量,并仅依靠通过 useEffect 进行检查的更新。见下文:

    useEffect(()=> {
       if(isReset) setChecked(false)
     }, [isReset])
    

    然后简单地将检查传递给输入:

    <input type="checkbox" className={style.checkboxCircle} checked={checked} onChange={(e) => handleOnChange(e)} />
    

    useMemo 只会在 isReset 更改时运行一次,并且由于您返回的是旧值,因此您的状态不会更新。

    【讨论】:

    • 感谢您的解释。有用!!但只有一次有效。当我点击重置,重新选择并再次尝试重置时,选中的标记仍然存在。有没有办法让它在每次点击重置时更新? **我最近才开始 react 还不习惯 hooks 的概念
    • 是的,问题是当您设置重置为真时,您永远不会将其设置回假。因此,下次您再次将其设置为 true 时,useEffect 不会检测到更改。我认为一个简单的修复方法不是依赖于重置为真,您可以在每次想要重置时简单地切换它。然后在使用效果中只要 setChecked(false) 任何时候它被切换。
    • 例如在resetAll:resetAll() {setReset(!reset) ...}和使用效果中去掉if条件
    • 谢谢!现在可以了!并感谢您的澄清。
    猜你喜欢
    • 2020-09-10
    • 2020-02-22
    • 1970-01-01
    • 2013-01-19
    • 2019-03-14
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多