【问题标题】:how to push the form data into array while clicking the submit in reactjs在reactjs中单击提交时如何将表单数据推送到数组中
【发布时间】:2019-04-17 21:35:09
【问题描述】:

这里我有表单数据。我必须将该数据推送到一个数组中。同时我必须检索该数据并将显示在另一个组件中。

import React from 'react';
import Button from '@material-ui/core/Button';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';
import TextField from '@material-ui/core/TextField';
import { Link } from 'gatsby';
import DisplayOutput from '../pages/DisplayOutput';
import { Formik, Field, Form, ErrorMessage } from 'formik';
import * as Yup from 'yup';

class DialogFormWithFormik extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      open: false,
      userName: '',
      password: '',
      data:'',
      dialogModal: 'none',
    }
  }

  handleClickOpen = () => {
    this.setState({ open: true })
    this.setState({ dialogModal: 'login' })
  }
  handleRegisterClickOpen = () => {
    this.setState({ open: true })
    this.setState({ dialogModal: 'register' })
  }

  handleClose = () => {
    this.setState({ dialogModal: false })
  }
  handleUsernameChange = event => {
    this.setState({
      userName: event.target.value,
    })
  }
  handlePasswordChange = e => {
    this.setState({
      password: e.target.value,
    })
  }

  handleSubmit = () => {
    console.log(this.state.userName + '' + this.state.password)
    alert('values submitted')
  }

  form = props => {
    return (
      <div>
        <Button
          variant="outlined"
          color="primary"
          onClick={() => this.handleClickOpen()}
        >
          Login
        </Button>
        &nbsp;
        <Button
          variant="outlined"
          color="primary"
          onClick={() => this.handleRegisterClickOpen()}
        >
          Register
        </Button>
        <Dialog
          onClose={() => this.handleClose()}
          aria-labelledby="customized-dialog-title"
          open={this.state.dialogModal === 'login'}
        >
          <Form onSubmit={this.handleSubmit}>
            <DialogTitle id="form-dialog-title">
              To Display Student Data
            </DialogTitle>
            <TextField
              label="Username"
              type="text"
              margin="normal"
              name="userName"
              id="userName"
              onChange={this.handleUsernameChange}
              value={this.state.userName}
            />

            <br />
            <TextField
              label="Password"
              type="password"
              autoComplete="current-password"
              margin="normal"
              id="passsword"
              onChange={this.handlePasswordChange}
              value={this.state.password}
            />
            <br />

            <DialogActions>
              <nav>
                <Button variant="contained" type="submit" color="primary">
                  Login
                </Button>
              </nav>

              <br />
              <Button onClick={() => this.handleClose()}>Cancel</Button>
            </DialogActions>
          </Form>
        </Dialog>
      </div>
    )
  }
  schema = () => {
    const schema = Yup.object().shape({
      userName: Yup.string().required(),
      password: Yup.string().required(),
    })
    return schema
  }

  render() {
    return (
      <div className="Sample" align="center">
        <Formik render={this.form} />
      </div>
    )
  }
}

export default DialogFormWithFormik

【问题讨论】:

    标签: reactjs gatsby


    【解决方案1】:

    在处理表单提交的方法中,将事件作为参数并调用preventDefaultRead more here。 所以提交时页面不会重新加载。然后将数据推送到正确的数组中。

    handleSubmit = (event) => {
        event.preventDefault();
        ...
    }
    

    【讨论】:

    • 实际上,我的问题是,当我提交表单时,我应该将表单值存储在一个数组中(如 JSON)。在这里我必须创建一个数组对象。之后,我必须从数组中检索数据。我可以在另一个组件中显示该数组值吗
    • 我会使用 Redux/MobX/React Context 进行数据传输(没有更好的词了)。 React contextReduxMobX
    • 如果我将使用 e.preventDefault()。这些值仍仅在该字段中。如果我们要清除字段数据,那么只有值是清除的。但我不希望那样。我希望表单应该与空字段一起存在。还有一件事。请阅读我的第一条评论。我想解决上述问题。
    • 如果您希望在提交后字段为空,您应该触发一个在提交后重置状态数据的方法。
    • 如何将表单数据(如用户名和密码)保存到数组中?
    【解决方案2】:

    试试这个。我只为一个输入字段创建,并根据您的项目文件导入和导出您的组件

    state = {
      username: '',
      items:[]
    };
    
    handleFormSubmit = (e) => {
    
      e.preventDefault();
      let items = [...this.state.items];
      items.push({
        username: this.state.username
      });
      this.setState({
        items,
        username: '',
      });
    };
    
    handleInputChange = (e) => {
      this.setState({
        username: e.target.value
      })
    }
    
    render() {
    
      return (
        <>
          <div className="container">
            <form className='from-group ' onSubmit={this.handleFormSubmit}>
    
              <input className='form-control no-border input-field ' id="username" value={this.state.username} type="text" name="username" onChange={this.handleInputChange} required/>
    
              <div className="text-center">
                <button type='submit' className="mt-3 col-md-12 btn  btn-primary">ADD</button>
              </div>
            </form>
            <div className='mt-3'>
              <div className='center'>
                <table className="table table-dark table-hover">
                  <tbody>
                    <tr>
                      <th>Username</th>
                    </tr>
                    {this.items.map(item =>{ 
                    return(
                      <tr>
                        <td>{item.username}</td>
                      </tr>
                      ); 
                    })}
                  </tbody>
                </table>
              </div>
            </div>
          </div>
        </>
      );
    }
    };
    

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2012-06-07
      • 2022-01-23
      相关资源
      最近更新 更多