【问题标题】:Setting useState within another useState在另一个 useState 中设置 useState
【发布时间】:2020-05-30 15:27:14
【问题描述】:

我试图通过使用useState 分别输入分钟和秒来设置时间(mm:ss),并将它们与另一个结合以跟踪整体表单数据,但是我似乎无法得到要推送到表单数据中的组合字符串...

我想我可能以某种方式错误地设置了数据...

const Modal = ({show, handleClose, handleAdd, children}) => {
    const today = new Date().toISOString().substr(0, 10);
    let initialFormState = {
        date: today,
        distance: '5.23',
        time: ''
    };
    let initialTimeState = {
        mins: 0,
        secs: 0
    };

    const [formData, setFormData] = useState(initialFormState);
    const [timeData, setTimeData] = useState(initialTimeState);

    const submitData = event => {
        event.preventDefault();
        console.log({timeData});

        // Add correctly formatted time to main formData
        const {mins, secs} = timeData;
        const time = `${mins}:${secs}`;
        setFormData({...formData, 'time': time});

        console.log(formData); // Here I can see that the 'time' field is empty...

    }

    return (
       ...
    );
};

export default Modal;

【问题讨论】:

  • 可以简单地存储对新对象的引用并将其传递给 setFormData() 并记录它
  • @charlietfl - 你能举个例子吗?
  • const newData ={...formData, 'time': time}; setFormData(newData); console.log(newData );

标签: javascript reactjs react-hooks use-state


【解决方案1】:

setFormData 更改是异步发生的,遗憾的是您不会立即看到修改。相反,您可以使用 useEffect 钩子来捕捉您的状态变化。

请尝试以下方法:

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

Using the Effect Hook 链接上进一步了解useEffect 挂钩。

【讨论】:

  • 嗯...这就是你所描述的,但它似乎也可以在加载时 console.log out 。我如何将它与onSubmit 集成?此模式会将数据推送回将显示它的仪表板。
  • @physicsboy 这应该不会导致任何问题,一旦更改了formData,您的组件将再次呈现。所以我认为这些变化应该反映在仪表板上。
  • 嗯...我想我对这应该如何工作感到困惑。我知道 useEffect 会起作用,在检测到更改时重新渲染,但我不确定如何实现它来设置表单状态。当我将setFormData 行移动到useEffect 时,我收到关于在useEffect 中使用setData 的警告。我对这个 React 东西有点n00b。
  • 啊哈!我有点笨拙,对不起。我确实花了一些时间和其他教程 (pluralsight.com/guides/…) 看到我应该依赖 timeData 并将 setFormData({...formData, 'time': time}) 放在 useEffect 函数中:-)
  • 谢谢,您的简短描述为我节省了 2 小时的搜索时间
猜你喜欢
  • 2022-01-13
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2020-02-14
  • 2020-04-19
  • 2020-11-30
相关资源
最近更新 更多