Je travaille sur la bibliothèque react-select
et, face à certains problèmes, j'utilise la bibliothèque redux-form
et en importe le composant <Field />
. Pour que je puisse soumettre les valeurs via le formulaire au service.
Mon problème:
Le code mentionné ci-dessous fonctionne bien lorsque j'utilise le paramètre par défaut de react-select. Je peux pouvoir sélectionner les valeurs du menu déroulant et la valeur sera sélectionnée même lorsque la mise au point sera terminée, la valeur restera. Mais la valeur sélectionnée n'est pas soumise via formulaire à cause de redux-form
, c'est pourquoi j'emballe le composant et l'utilise avec <Field name="sample" component={RenderSelectInput} id="sampleEX" options={options} />
.
import React from 'react';
import Select from 'react-select';
import RenderSelectInput from './RenderSelectInput'; // my customize select box
var options = [{ value: 'one', label: 'One' }, { value: 'two', label: 'Two' }];
class SelectEx extends React.Component {
constructor() {
super();
this.state = { selectValue: 'sample' }
this.updateValue = this.updateValue.bind(this);
}
updateValue(newValue) {
this.setState({ selectValue: newValue })
}
render() {
return (
<div>
<Select name="select1" id="selectBox" value={this.state.selectValue} options={options} onChange={this.updateValue}/>
//This works but value won't submit ...
<Field name="sample" component={RenderSelectInput} id="sampleEX" options={options} />
//For this, selected value vanishes once I come out of component.
</div>
)
}
}
export default SelectEx;
Mais lorsque j'utilise avec mon personnalisé, sélectionnez (j'emballe le pour soumettre la valeur à partir du formulaire), le composant <Select>
peut être visible dans l'interface utilisateur, même les valeurs également. Mais incapable de sélectionner la valeur dans la liste déroulante ..., si je sélectionne également, il s'affiche dans la zone <Select>
mais disparaît au moment de la mise au point. Aidez-moi, s'il vous plaît ...
RenderSelectInput composant:
import React from 'react';
import {Field, reduxForm} from 'redux-form';
import Select from 'react-select';
import 'react-select/dist/react-select.css';
const RenderSelectInput = ({input, options, name, id}) => (
<div>
<Select {...input} name={name} options={options} id={id} />
</div>
)
export default RenderSelectInput;
Merci, Shash
Lorsque vous utilisez react-select
avec redux-form, vous devez modifier le comportement par défaut des méthodes onChange
et onBlur
et appeler la méthode onChange
et onBlur
de redux-form
.
Alors, essayez ceci:
const RenderSelectInput = ({input, options, name, id}) => (
<Select
{...input}
id={id}
name={name}
options={options}
value={input.value}
onChange={(value) => input.onChange(value)}
onBlur={(value) => input.onBlur(value)}
/>
)
et utiliser le composant ci-dessus comme
<Field component={RenderSelectInput} />
L'appel de la méthode onBlur
de redux-form
lorsque le focus est supprimé du champ Select
empêchera la perte de valeur.
Ici cela a fonctionné pour moi,
import React, { Component } from 'react';
import Select from 'react-select';
import 'react-select/dist/react-select.css';
export default class RenderSelectInput extends Component {
onChange(event) {
if (this.props.input.onChange && event != null) {
this.props.input.onChange(event.value);
} else {
this.props.input.onChange(null);
}
}
render() {
const { input, options, name, id, ...custom } = this.props;
return (
<Select
{...input}
{...custom}
id={id}
name={name}
options={options}
value={this.props.input.value || ''}
onBlur={() => this.props.input.onBlur(this.props.input.value)}
onChange={this.onChange.bind(this)}
/>
);
}
}
cela a été extrait d'ici: https://ashiknesin.com/blog/use-react-select-within-redux-form/
Essayez de définir la propriété onBlurResetInput
sur false.
Quelque chose comme.
const SelectInput = ({input: { onChange, value }, options, name, id}) => (
<Select
name={name}
value={value}
options={options}
onChange={onChange}
onBlurResetsInput={false}
/>
)
J'espère que cela t'aides!
Utilisez ceci qui fonctionne parfaitement et il gère également la validation de formulaire redux.
import React, {Component} from 'react';
import Select from 'react-select';
import {FormGroup} from "reactstrap";
class CustomSelect extends Component {
render() {
const {meta: {touched, error}} = this.props;
const className = ` form-group mb-3 ${touched && error ? 'has-danger' : '' }`;
return (
<FormGroup>
<Select
{...this.props}
value={this.props.input.value}
onChange={(value) => this.props.input.onChange(value)}
onBlur={() => this.props.input.onBlur(this.props.input.value)}
options={this.props.options}
placeholder={this.props.placeholder}
/>
<div className={className}>
<div className="text-help">
{touched ? error : ''}
</div>
</div>
</FormGroup>
);
Utilisez le composant CustomSelect dans le composant de champ de formulaire redux comme
<Field
name='country_name'
options={this.state.countries}
component={CustomSelect}
placeholder="Select your country"
/>