react usestate里定义的值没更新

  const [taxCodeDisable, setTaxCodeDisable] = useState(false); 

  const handleBatchSetup = (value) => {
    productData.forEach(item=>{
      if(item.taxRate!==value){
//如果值不相等,就禁用按钮
        setTaxCodeDisable(false);
      }else{
        setCurTaxCode(value)
        setTaxCodeDisable(true);
      }
    })

    console.log("taxCodeDisable",taxCodeDisable)
    
  };
//按钮如下
<Form.Item>
                      {getFieldDecorator('taxcodeSelect')(
                        <Select
                        style={{ width: '100px' }}
                        disabled={isEditOrDetail === 'detail' || taxCodeDisable}
                        value={productTaxCode}
                        optionLabelProp="value"
                        filterOption={false}
                        placeholder={intl.get('mallf.common.view.createorder.slectTaxCode').d('请选择税码')}
                        onFocus={() => {
                          taxFocus();
                        }}
                        // onChange={e => taxCodeChange(e, record, index)}
                      >
                        {taxCodeList &&
                          taxCodeList.map(item => {
                            return <Option key={item}>{item}</Option>;
                          })}
                      </Select>
                      )}
                    </Form.Item>

点击按钮“handleBatchSetup”,执行方法,直接给taxCodeDisable赋值,但是打印出来值还是false,why??可以怎么解决??想通过setTaxCodeDisable的变化决定taxCodeDisable来判断按钮是否置灰

阅读 3.3k
1 个回答

你可能对react hook的理解有偏差,state在一个函数上下文中的值是不变的,setstate后,会重新初始化函数上下文,包括变量的重新声明(除了被useXXX包裹的内容),你上面的例子,想要看到效果,可以

const [taxCodeDisable, setTaxCodeDisable] = useState(false);

// 这个应该包一层useCallback,避免重新声明方法
const handleBatchSetup = () => {
  setTaxCodeDisable(true);
};

useEffect(() => {
  console.log("taxCodeDisable", taxCodeDisable)
}, [taxCodeDisable])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题