首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >react复选框不会在没有随机密钥的情况下重置?

react复选框不会在没有随机密钥的情况下重置?
EN

Stack Overflow用户
提问于 2021-04-25 16:46:59
回答 1查看 51关注 0票数 0

你好,我有一个checkbox组件,看起来像这样

代码语言:javascript
复制
export default function Checcky({
  lab,
  checcky,
  name,
  className = "",
  onChange,
}) {
  return (
    <div className={"checkky relative flex center-flex " + className}>
      <label htmlFor={name} className="labelin mr-4">
        {lab}
      </label>
      <input
        id={name}
        name={name}
        type="checkbox"
        defaultChecked={checcky}
        onChange={onChange}
        className=" absolute center-absolute"
      />
      <label htmlFor={name} className="slider relative cursor-p"></label>
    </div>
  );
}

我是这样使用它的

代码语言:javascript
复制
       <Checcky
            lab="Admin"
            name="admin"
            key={ Math.random() }
            onChange={handleChange}
            checcky={values.admin}
            className="justify-start my-4"
        />

我注意到,如果我不把key={Math.random()}“重置”为它的原始值,输入就不会被“检查回来”,这是我经常遇到的情况

代码语言:javascript
复制
const [values,setValues] = useState({admin:false})
const handleChange = (e) =>{
  let v = values[e.target.name];
  v = e.target.checked;
  setValues({...values,[e.target.name] : v})
}

但是,如果我这样做,可能是一个fetch,在结果之后,我想要重置状态,如下所示

代码语言:javascript
复制
const postData = async () =>{
  await fetch(somerandomurl)
  setValues({...values,admin:false})
}

输入不会被取消检查,即使状态改变了,它也会保持检查状态,除非我放入这个key={Math.random()},我知道它是有效的,因为由于键改变了,组件被重新呈现,但是有没有办法在没有这个变通的情况下做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-25 17:29:26

试试这些:

使用checked而不是defaultChecked

代码语言:javascript
复制
<input
  id={name}
  name={name}
  type="checkbox"
  checked={checcky}
  onChange={onChange}
  className=" absolute center-absolute"
/>

使用功能状态更新,因为您的新状态依赖于旧状态:

代码语言:javascript
复制
const handleChange = (e) => {
  const { name, checked } = e.target;
  setValues(prevValues => ({...prevValues, [name]: checked }))
}

代码语言:javascript
复制
const postData = async () =>{
  await fetch(somerandomurl)
  setValues(prevValues => ({...prevValues, admin: false }))
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67251441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档