微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在 useEffect 钩子中使用反应表单数据

如何解决无法在 useEffect 钩子中使用反应表单数据

我有一个 antd 表单,我可以在点击提交按钮后在 onFinish function获取表单数据,我想在其中使用 uesEffect hook 并使用表单数据作为 redux saga 的有效负载,但出现以下错误

React Hook "useEffect" is called in function "onFinish" that is neither a React function component nor a custom React Hook function.

如果我在 onFinsh 函数之外编写 useEffect 钩子,我将无法获取表单数据/值


请提出一种解决方法以在 onFinish 函数之外获取表单数据值


import React,{ useState,useEffect } from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import './index.css';
import { Form,Input,Button,CheckBox } from 'antd';
 

const Demo = () => {
  const onFinish = (values) => {
    // alert(JSON.stringify(values['username']));
    useEffect(() => {
      // dispatch an action with values as payload
     },[]);
  };
console.log(values) // UNABLE TO GET VALUES HERE...HOW TO GET IT???
  return (
    <Form
      name="basic"
      onFinish={onFinish}>
      <Form.Item
        label="Username"
        name="username">
        <Input />
      </Form.Item>
      <Form.Item>
        <Button type="primary" htmlType="submit">
          Submit
        </Button>
      </Form.Item>
    </Form>
  );
};

ReactDOM.render(<Demo />,document.getElementById('container'));

解决方法

看起来您甚至不需要 useEffect() 钩子。只需从 onFinish() 内分派动作并让状态存储 values

const Demo = () => {

  const [ values,setValues ] = useState([]);
  
  const onFinish = (recievedValues) => {
    // dispatch here
    setValues(recievedValues);
  }
  
  console.log(values) // <-- you can get it here
  return (<div> ... </div>);
};

或者更好的是,由于您已经在调度期间将值保存在 redux 中,因此您也应该在渲染代码中使用它:

import { useSelector } from 'react-redux';

const Demo = () => {

  //point to the state where your data is
  const stateValues = useSelector(state => state.your.data);
  
  const onFinish = (recievedValues) => {
    // dispatch here
  }
  
  console.log(stateValues) // <-- you can get it here
  return (<div> ... </div>);
};

,

useEffect 只能在组件的顶层调用,不能在函数内调用。在这种情况下,您不应该需要 useEffect 来分派动作,而是可以直接在 onFinish 中这样做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。