代码之家  ›  专栏  ›  技术社区  ›  MitchEff

React钩子会随时更新

  •  0
  • MitchEff  · 技术社区  · 5 年前

    所以,我使用钩子来管理一组表单的状态,设置如下:

        const [fieldValues, setFieldValues] = useState({}) // Nothing, at first
    

    设置该值时,状态不会更新:

        const handleSetValues = values => {
            const _fieldValues = {
                ...fieldValues,
                ...values
            }
    
            setFieldValues(_fieldValues)
    
            console.log(fieldValues) // these won't be updated
    
            setTimeout(() => {
                console.log(fieldValues) // after ten seconds, it's still not updated
            },10000)
        }
    

    如果我第二次调用该函数,它将已更新,但这对我不起作用。 我从未在类组件中看到过这样的行为。

    这是为了…喜欢,而不是更新吗?或者只是随时更新?令人困惑的行为。

    0 回复  |  直到 5 年前
        1
  •  2
  •   Zain Ul Abideen    5 年前

    setFieldValues(_fieldValues) 是一个异步调用,意味着您将无法在下一行中获得结果。

    您可以使用 useEffect 钩子。

    useEffect(() => {
        // do your work here
      }, [fieldValues]);
    

    从你的问题来看,你似乎有React类组件的背景,所以 使用效果 类似于 componentDidMount componentDidUpdate 生命周期方法。

    使用效果 每当依赖关系数组中的状态(在您的例子中为[fieldValues])发生变化,并且您在中获得更新的值时,就会调用 使用效果 身体。

    你也可以表演 componentWillUnmount 工作在 使用效果 也。

    简要介绍一下 guide .

        2
  •  0
  •   Agney Sidharth yadav    5 年前

    setFieldValues 是一个异步函数,因此记录语句下方的值不会有任何影响。

    关于使用 setTimeout ,该函数将捕获传递给它的道具的当前值,因此这将是打印到控制台的值。这适用于任何JS函数,请参阅下面的代码片段:

    function init(val) {
      setTimeout(() => {
          console.log(val);
      }, 1000);
    }
    
    let counterVal = 1;
    
    init(counterVal);
    counterVal++;

    那么,当值发生变化时,我们如何打印这些值呢?简单的机制是使用 useEffect :

    useEffect(() => {
      console.log(fieldValues)
    }, [fieldValues]);