React Jsx 检查 属性 被覆盖
React Jsx checked property got override
我在这里尝试制作一个复选框,以便能够 select 和重置。 *因为它是一个弹出窗口,它应该能够通过点击更新,而不是在重新渲染之后。
最初,当我将'checked'作为{ checked }
放入UserListElement.tsx时,复选框能够正常select。但是我也需要一个重置功能,所以我添加了 isReset 属性 并将 UserListElement.tsx 中的 'checked' 值更改为 {handleOnCheck}
.
现在 selected 时,单选按钮未selected
但是当我单击 'reset' 时,之前 selected 的项目现在似乎是 selected,而一切都应该取消选中(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>
);
};
你的问题是你在 useMemo 中 return checked 变量的旧值(当你 return 它时状态没有更新 checked )。我将消除 useMemo 以及 handleOnCheck 变量,并简单地依赖于通过 useEffect 检查的更新。见下文:
useEffect(()=> {
if(isReset) setChecked(false)
}, [isReset])
然后简单地通过检查输入:
<input type="checkbox" className={style.checkboxCircle} checked={checked} onChange={(e) => handleOnChange(e)} />
useMemo 只会在 isReset 更改时 运行 一次,并且由于您 return 使用过时的值,因此您的状态不会更新。
我在这里尝试制作一个复选框,以便能够 select 和重置。 *因为它是一个弹出窗口,它应该能够通过点击更新,而不是在重新渲染之后。
最初,当我将'checked'作为{ checked }
放入UserListElement.tsx时,复选框能够正常select。但是我也需要一个重置功能,所以我添加了 isReset 属性 并将 UserListElement.tsx 中的 'checked' 值更改为 {handleOnCheck}
.
现在 selected 时,单选按钮未selected
但是当我单击 'reset' 时,之前 selected 的项目现在似乎是 selected,而一切都应该取消选中(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>
);
};
你的问题是你在 useMemo 中 return checked 变量的旧值(当你 return 它时状态没有更新 checked )。我将消除 useMemo 以及 handleOnCheck 变量,并简单地依赖于通过 useEffect 检查的更新。见下文:
useEffect(()=> {
if(isReset) setChecked(false)
}, [isReset])
然后简单地通过检查输入:
<input type="checkbox" className={style.checkboxCircle} checked={checked} onChange={(e) => handleOnChange(e)} />
useMemo 只会在 isReset 更改时 运行 一次,并且由于您 return 使用过时的值,因此您的状态不会更新。