Отправка данных формы Formik в базу данных Firebase в ответ - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь выяснить, как отправить данные формы из формы Formik в базу данных Firebase в моем приложении реакции.

У меня есть следующая форма:

import React from 'react'
import { Link } from 'react-router-dom'

// import { Formik } from 'formik'
import { Formik, Form, Field, ErrorMessage, withFormik } from 'formik';
import * as Yup from 'yup';

import { Badge, Button, Col, Feedback, FormControl, FormGroup, FormLabel, InputGroup } from 'react-bootstrap';
import Select from 'react-select';
import firebase from '../../../firebase';

const style1 = {
    width: '60%',
    margin: 'auto'
}

const style2 = {
    paddingTop: '2em',
}

const style3 = {
    marginRight: '2em'
}

const style4 = {
    display: 'inline-block'
}

const options = [
    { value: 'author', label: 'Author' },
    { value: 'reviewer', label: 'Reviewer' },

  ];
class Basic extends React.Component {

  state = {
    selectedOption: null,
  }
  handleChange = (selectedOption) => {
    this.setState({ selectedOption });
    console.log(`Option selected:`, selectedOption);
  }
  render() {
    const { selectedOption } = this.state;

        return (
            <Formik
                initialValues={{
                    firstName: '',
                    lastName: '',
                    email: '',
                    password: '',
                    confirmPassword: '',
                    selectedOption: null

                }}

                validationSchema={Yup.object().shape({
                    firstName: Yup.string()
                        .required('First Name is required'),
                    lastName: Yup.string()
                        .required('Last Name is required'),
                    email: Yup.string()
                        .email('Email is invalid')
                        .required('Email is required'),
                    selectedOption: Yup.string()
                        .required('It will help us get started if we know a little about your background'),    
                    password: Yup.string()
                        .min(6, 'Password must be at least 6 characters')
                        .required('Password is required'),
                    confirmPassword:  Yup.string()
                        .oneOf([Yup.ref('password'), null], 'Passwords must match')
                        .required('Confirm Password is required')
                })}

                // onSubmit={fields => {
                //     alert('SUCCESS!! :-)\n\n' + JSON.stringify(fields, null, 5))
                // }}

                // onSubmit={handleSubmit}

                render={({ errors, status, touched }) => (

                    <Form style={style1}>

                    <h1 style={style2}>Get Started</h1>

                        <div className="form-group">
                            <label htmlFor="firstName">First Name</label>
                            <Field name="firstName" type="text" className={'form-control' + (errors.firstName && touched.firstName ? ' is-invalid' : '')} />
                            <ErrorMessage name="firstName" component="div" className="invalid-feedback" />
                        </div>
                        <div className="form-group">
                            <label htmlFor="lastName">Last Name</label>
                            <Field name="lastName" type="text" className={'form-control' + (errors.lastName && touched.lastName ? ' is-invalid' : '')} />
                            <ErrorMessage name="lastName" component="div" className="invalid-feedback" />
                        </div>
                        <div className="form-group">
                            <label htmlFor="email">Email</label>
                            <Field name="email" type="text" placeholder="Please use your work email address" className={'form-control' + (errors.email && touched.email ? ' is-invalid' : '')} />
                            <ErrorMessage name="email" component="div" className="invalid-feedback" />
                        </div>


                        <div className="form-group">
                            <label htmlFor="password">Password</label>
                            <Field name="password" type="password" className={'form-control' + (errors.password && touched.password ? ' is-invalid' : '')} />
                            <ErrorMessage name="password" component="div" className="invalid-feedback" />
                        </div>
                        <div className="form-group">
                            <label htmlFor="confirmPassword">Confirm Password</label>
                            <Field name="confirmPassword" type="password" className={'form-control' + (errors.confirmPassword && touched.confirmPassword ? ' is-invalid' : '')} />
                            <ErrorMessage name="confirmPassword" component="div" className="invalid-feedback" />
                        </div>

                        <div className="form-group">
                        <label htmlFor="selectedOption">Which role best describes yours?</label>

                        <Select
                            value={selectedOption}
                            onChange={this.handleChange}
                            options={options}
                        />
                        </div>
                        <div className="form-group" >
                            <label  htmlFor="consent">By registering you accept the <Link to={'/Terms'}>Terms of Use</Link> and <Link to={'/Privacy'}>Privacy Policy</Link> </label>

                        </div>


                        <div className="form-group">
                            <Button variant="outline-primary" type="submit" style={style3} id="submitRegistration">Register</Button>
                        </div>
                    </Form>
                )}
            />

    );
  }
}

export default Basic; 

Iу меня есть база данных в firebase (облачный firestore) с коллекцией под названием Registrations, в которой поля имеют имена, совпадающие с каждым из этих полей формы.

Я провел день, следуя учебным пособиям, которые, кажется, созданы для реакции до Formik.Нет особого смысла показывать все вещи, которые я попробовал и потерпел неудачу в течение дня - они явно не написаны с мыслью о Формике.Я не могу найти способ написать onSubmit, чтобы Formik мог передавать данные в Firebase.

Кто-нибудь нашел текущий учебник или знает, как это сделать?

1 Ответ

0 голосов
/ 30 апреля 2019

Я использовал Formik и Firebase в этом проекте React с открытым исходным кодом.Может быть, это то, что вы ищете:)

Native Kit Expertizo React

...