如何在没有回调函数的情况下使用React Hook状态变量?

时间:2019-04-18 18:49:58

标签: javascript reactjs react-hooks

当我的复选框被选中或未选中时,需要设置特定数据。现在,我正在状态变量中将checked的值设置为true或false。问题是它没有像setState这样的回调函数,因此当我在onChange函数中对其进行更新时,它不会及时更新下一组数据以正确更新。在newEnhanceableData上设置属性取决于该复选框是选中还是未选中。如何及时更新我的​​选中属性,以便newEnhanceableData的下一行更新其属性?

以下是状态变量:

const [checkbox, setCheckbox] = useState({checked: true});
const [enhanceableData, setEnhanceableData] = useState({
  name: 'Item Clicked',
  properties: {
    ...defaultProps,
    activityLocation: 'Member - RAQ Contact Details',
    autopopulated: true,
    changeType: 'Add'
  }
});

这是我对其进行更新的地方:

<input 
  id='raq-sms-text-checkbox' 
  type='checkbox' 
  defaultChecked={true}
  style={{marginRight: 5}}
  onChange={() => {
    setCheckbox({checked: !checkbox.checked});

    const newEnhanceableData = enhanceableData;
    newEnhanceableData.properties.changeType = checkbox.checked ? 'Add' : 'Remove';
    newEnhanceableData.properties.autopopulated = false;
    setEnhanceableData(newEnhanceableData)

    console.log('checkbox: ', checkbox)
    console.log('enhanceableData: ', enhanceableData)

    sendEnhancedTrackEvent(enhanceableData);
  }} /> 

您可以在此处看到,在设置了enabledableData之后,选中的属性会更新:

enter image description here

1 个答案:

答案 0 :(得分:1)

您可能根本不需要钩子,只需在onChange函数中检查选中状态:

<label>
  <input
    type="checkbox"
    onChange={ev => {
      const { checked } = ev.currentTarget;
      console.log(checked) // toggles to true and false
      // continue with the rest
    }}
  />
  Click me
</label>

如果您想将逻辑移到其他地方,useEffect可能会有用:

const [checked, setChecked] = useState(true);

useEffect(() => {
   // do-enhanced-computing-stuff-here
}, [checkbox]) // <-- effect only runs if checkbox boolean state changes 

<input checked={checked} onChange={ev => setChecked(ev.currentTarget.checked)} />