简体   繁体   English

如何在反应中使用 react-hook-form 将表单数据发送到 state?

[英]How to send the form data up a state using react-hook-form in react?

I am new to React.我是 React 的新手。 What I want to do is have a submit button to log the data/state onto the console from the form's input fields which is in another component.我想要做的是有一个提交按钮,用于将数据/状态从另一个组件中的表单输入字段记录到控制台。 To implement this, I have the ResultList component which renders the Filter component which has the form.为了实现这一点,我有 ResultList 组件,它呈现具有表单的过滤器组件。 When the submit button is clicked the data from the input fields should log onto the console.单击提交按钮时,输入字段中的数据应登录到控制台。 I used react-form-hook to implement the form.我使用 react-form-hook 来实现表单。 This is the link to the sandbox这是沙盒的链接

ResultList component looks like: ResultList 组件如下所示:

import React, { Component } from 'react';
import { render } from 'react-dom';
import Filter from './Filter';

import { Button, Dropdown, Input, } from 'semantic-ui-react';

export default class ResultList extends Component {
   constructor(props){
      super(props);

      this.state = {
          myName: '',
          myEmail: ''
      };
    }

    handleParentData = (formModel) => {
      console.log(formModel);

      this.setState({...formModel},()=>alert(JSON.stringify(this.state)));
    }

  render() {
    return (
        <div>

          <Filter handleData={this.handleParentData}/>
          <p>{this.state.myName}</p>  
          <p>{this.state.email}</p>     
        </div>
    )
  }
}

and Filter component looks like:和过滤器组件看起来像:

import React, { Component } from 'react';
import {useForm} from 'react-hook-form';

export default function Filter() {

  const {register,handleSubmit} = useForm();

  const onSubmit = (data) => {
    // console.log(data);
    this.props.handleData(data);
  } 

  return (
    <div>
      <form onSubmit={handleSubmit(onSubmit)}>
        Name: <input type="text" name="myName" ref={register}/>
        <br />
        Email: <input type="text" name="myEmail" ref={register}/>
        <br /><br />
        <input type="submit" value="Submit"/>
      </form>
    </div>
  )

}

Need to accept props in the functional component, and change the onSubmit handler to use props and not this.props .需要在功能组件中接受 props,并将onSubmit处理程序更改为使用props不是this.props Functional components are instanceless and have no this object.功能组件是无实例的,没有this object。

export default function Filter(props) {

  const { register, handleSubmit } = useForm();

  const onSubmit = data => {
    props.handleData(data);
  } ;

  return (
    <div>
      <form onSubmit={handleSubmit(onSubmit)}>
        Name: <input type="text" name="myName" ref={register}/>
        <br />
        Email: <input type="text" name="myEmail" ref={register}/>
        <br /><br />
        <input type="submit" value="Submit"/>
      </form>
    </div>
  );
}

Alternatively you can destructure props right in the function signature或者,您可以直接在 function 签名中解构道具

export default function Filter({ handleData }) {

  const { register, handleSubmit } = useForm();

  const onSubmit = data => handleData(data);

  return (
    <div>
      <form onSubmit={handleSubmit(onSubmit)}>
        Name: <input type="text" name="myName" ref={register}/>
        <br />
        Email: <input type="text" name="myEmail" ref={register}/>
        <br /><br />
        <input type="submit" value="Submit"/>
      </form>
    </div>
  );
}

You need to pass props to Filter:您需要将道具传递给过滤器:

export default function Filter(props) {

and remove .this.props :并删除.this.props

props.handleData(data);

Full code:完整代码:

import React, { Component } from 'react';
import {useForm} from 'react-hook-form';

export default function Filter(props) {

  const {register,handleSubmit} = useForm();

  const onSubmit = (data) => {
    // console.log(data);
    props.handleData(data);
  } 

  return (
    <div>
      <form onSubmit={handleSubmit(onSubmit)}>
        Name: <input type="text" name="myName" ref={register}/>
        <br />
        Email: <input type="text" name="myEmail" ref={register}/>
        <br /><br />
        <input type="submit" value="Submit"/>
      </form>
    </div>
  )

}

You also need to change from {this.state.email} to {this.state.myEmail}您还需要从{this.state.email}更改为{this.state.myEmail}

Full code:完整代码:

import React, { Component } from 'react';
import { render } from 'react-dom';
import Filter from './Filter';

import { Button, Dropdown, Input, } from 'semantic-ui-react';

export default class ResultList extends Component {
   constructor(props){
      super(props);

      this.state = {
          myName: '',
          myEmail: ''
      };
    }

    handleParentData = (formModel) => {
      console.log(formModel);

      this.setState({...formModel},()=>alert(JSON.stringify(this.state)));
    }


  render() {
    return (
        <div>

          <Filter handleData={this.handleParentData}/>
          <p>{this.state.myName}</p>  
          <p>{this.state.myEmail}</p>     

        </div>
    )
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM