【问题标题】:The value of the checkboxes does not change React复选框的值不会改变 React
【发布时间】:2022-01-15 02:33:54
【问题描述】:

我正在对我的产品进行过滤,此时我有两个复选框,一个是保修,另一个是安装,我的 onChange 方法是这样的:

const [data, setData] = useState({
        install: false,
        warranty: false
})

const handleInputChanges = (e) => {
        const { name, type, checked, value } = e.target;
        const eachValue = type === 'checkbox' ? checked : value;

        setData({
            ...data,
            [name]: eachValue
        })
        console.log(data)
}

输入是这样的:

<FormControlLabel
         name="install"
         control={
         <Checkbox
                  name="install"
                  onChange={handleInputChanges}
                  color="primary"
                  value={data.install}
         />
         }
         label="Instalación"
/>
<FormControlLabel
         name="warranty"
         control={
         <Checkbox
                  name="warranty"
                  onChange={handleInputChanges}
                  color="primary"
                  value={data.warranty}
         />
         }
         label="Garantía"
/>

问题是当我点击复选框时,值没有改变,要改变它我必须按两次,但值与复选框不一致。示例:复选框处于活动状态(视觉上),但在值中它返回 false,反之亦然。两种输入都会发生这种情况。

【问题讨论】:

    标签: reactjs input checkbox react-hooks


    【解决方案1】:

    将控制台放在handleInputChanges 之外以获取最新状态值

    对于on input Change 事件的最佳实践,请传递state namestate value,以便您可以在handleChange 函数中轻松使用!

    这是我的代码,请检查

    function App() {
      const [data, setData] = useState({
        install: false,
        warranty: false
      })
    
      const handleInputChanges = (name, value) => {
        setData({ ...data, [name]: value });
      }
      console.log(data)
    
      return (
        <div>
          <FormControlLabel
            name="install"
            control={
              <Checkbox
                name="install"
                onChange={(e) => handleInputChanges('install', e.target.checked)}
                color="primary"
                value={data.install}
              />
            }
            label="Instalación" />
    
          <FormControlLabel
            name="warranty"
            control={
              <Checkbox
                name="warranty"
                onChange={(e) => handleInputChanges('warranty', e.target.checked)}
                color="primary"
                value={data.warranty}
              />
            }
            label="Garantía" />
        </div>
      );
    };
    export default App;)
    

    【讨论】:

    • 感谢您的回答和建议,代码运行正常。
    • 如果我的回答对你有帮助。接受它:)
    【解决方案2】:

    当像这样更新状态时,你不应该直接访问旧状态:

    setData({
       ...data,
       [name]: eachValue
    })
    

    你最好这样做:

    setData(data => ({
       ...data,
       [name]: eachValue
    }))
    

    您可以将我的回答与@mayur-vaghasiya 先生的回答结合起来。

    【讨论】:

    • 感谢您的帮助,正如您所说,两个代码都可以正常工作。
    • @YCrhis 很高兴知道。现在最好将问题设置为已回答。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2021-03-11
    • 2018-08-16
    相关资源
    最近更新 更多