如何在withFormik中的handleSubmit中分派事件

时间:2019-07-17 12:18:43

标签: reactjs formik

formik仍然是新手,并做出了反应。

这是我的代码。

// react
import React, { useEffect } from 'react';
import { withFormik } from 'formik';
import { useDispatch } from 'redux-react-hook';
import { takeEvery, call, put } from 'redux-saga/effects';

// row, col, field, input, buttonGroup
import {
    Row,
    Col,
    FieldWrapper,
    Input,
    ButtonGroup
} from 'some-tool';

const searchTypeOption = [
    ....
];

const SearchForm = (props: any) => {
    const {
      values,
      touched,
      errors,
      handleChange,
      handleSubmit,
    } = props;

    return (
        <form onSubmit={handleSubmit}>
            <Row>
                <Col md="3">
                    <FieldWrapper required={true}>
                        <Select name="searchKey" onChange={handleChange} value={values.searchKey} options={searchTypeOption} />
                    </FieldWrapper>
                    {errors.searchKey && touched.searchKey && <div>{errors.searchKey}</div>}
                </Col>
                <Col md="5">
                    <FieldWrapper>
                        <Input
                            placeholder="Search"
                            type="text"
                            onChange={handleChange}
                            value={values.searchValue}
                            name="searchValue"
                        />
                    </FieldWrapper>
                    {errors.searchValue && touched.searchValue && <div>{errors.searchValue}</div>}
                </Col>
            </Row>

            <Row>
                <ButtonGroup>
                    <Button>Clear</Button>
                    <Button type="submit">Search</Button>
                </ButtonGroup>
            </Row>
        </form>
    );
  };

  export const Search = withFormik({
    mapPropsToValues: () => ({ searchKey: '', searchValue: '' }),

    // Custom sync validation
    validate: values => {
      let errors = {};


      //if (values.hasOwnProperty('searchKey') && !values.searchKey) {
      //  errors.searchKey = 'Required';
      //}


      return errors;
    },

    handleSubmit: (values, { props, setSubmitting }) => {
        const payload = {
            searchKey: values.searchKey,
            searchValue: values.searchValue
        };

        // NOTE: obj.props is empty.....
        console.log(obj);

        // How to use dispatch here or some way to fire event
        dispatch({ type: 'SEARCH_DOCS', payload: payload });
    },
  })(SearchForm);

handleSubmit中,我该如何调度事件,以使saga和redux能够接收它们?

1 个答案:

答案 0 :(得分:0)

为此,您必须传递一个已连接的组件,以便可以访问调度

像您一样用Formik包裹起来

const SearchFormFormik = withFormik(SearchForm) 

然后将其连接到redux

const mapDispatchToProps = {
  searchDocFun,
};

const ConnectedSearchForm = connect(
  null,
  mapDispatchToProps
)(SearchFormFormik);

然后您可以在处理提交时使用searchDocFun

handleSubmit: (values, { props, setSubmitting }) => {
        props.searchDocFun(values)
    }