Поле выбора Formik не обновляет поле при отправке формы - PullRequest
0 голосов
/ 27 октября 2018

Я использую Formik с React для обработки форм моего веб-приложения.

Когда я пытаюсь отправить любую форму с полем, она не включает в себя правильное выбранное значение для этого поля, она принимает значение по умолчанию.

В приведенном ниже случае элемент соответствует входу "clientId", когда я выбираю клиента и затем отправляю форму, Formik всегда принимает clientId в качестве пустой строки (значение по умолчанию).

Я попытался заменить окно динамического выбора следующим кодом из документов

<Field name="color" component="select" placeholder="Favorite Color">
  <option value="red">Red</option>
  <option value="green">Green</option>
  <option value="blue">Blue</option>
</Field>

, но все же оно не сработало.

Есть ли проблемы с моим кодом?Это ошибка в версии, которую я использую?

Я пытался найти какие-либо проблемы на github, связанные с этой проблемой, но ничего не смог найти.

Вот моя форма formik:

<Formik
            onSubmit={this.handleSubmit}
            initialValues={{clientId: '', invoice_number: '', date: '', products: []}}
            render={({
                         values,
                         errors,
                         status,
                         touched,
                         handleBlur,
                         handleChange,
                         handleSubmit,
                         isSubmitting,
                     }) => (
                <form onSubmit={handleSubmit}>

                    <SelectClientInput
                        name={"clientId"}
                    />


                    <br/>

                    <input
                        placeholder="Número da fatura"
                        type="text"
                        name="invoice_number"
                        className={"form-control"}
                        onChange={handleChange}
                        onBlur={handleBlur}
                        value={values.invoice_number}
                    />

                    <br/>

                    <input
                        placeholder="Data"
                        type="date"
                        name="date"
                        className={"form-control"}
                        onChange={handleChange}
                        onBlur={handleBlur}
                        value={values.date}
                    />



                    <br/>


                    <button type="submit" className={"btn btn-success"} disabled={isSubmitting}>
                        Criar produto
                    </button>
                </form>
            )}
        />)

и этот компонент SelectClientInput

class SelectClientInput extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            clients: [],
        }
    }

    componentWillMount = () => {
        this.searchClients();
    }

    searchClients = (inputValue = "") => {
        var self = this;
        //Search tax payers
        axios.get('/api/clients')
            .then(function (response) {
                var clients = response.data.clients;
                self.setState({clients: clients});
            })
            .catch(function (error) {
                console.log(error);
            });
    }

    render = () => {
        return (
            <Field
                component="select"
                name={this.props.name}
                className={'form-control'}
            >
                {(this.state.clients && this.state.clients.length > 0) ?
                    this.state.clients.map((client) => {
                        return (<option key={client.id} value={client.id}>{client.name}</option>);
                    }) : (<option key={1}>Nenhum cliente encontrado</option>)
                }
            </Field>
        );
    }
};

Я использую response-dom 16.6 и formik 1.3.1

Примечание. Каждое поле отправляется с правильным значением, кроме формыполя.

Спасибо!

1 Ответ

0 голосов
/ 28 октября 2018

У вас нет «связи» между элементами управления / полями и values от formik.

Их состояние / значение необходимо сохранить в values, как это делается с использованием handleChange для входов.

<Field /> необходимо поместить в компонент <Form />, а не просто html <form />.

<SelectClientInput /> - это компонент, для него требуется отдельный обработчик изменений (обновление Formik values используя setValues), переданный как опора.Фактическое значение (values.clientId) также должно быть передано как prop.Это стандартная техника подъема техника.

...