J'utilise Antd Select
composant pour créer un composant personnalisé qui me donne la possibilité de renvoyer un objet au lieu d'une valeur primitive et afficher la valeur imbriquée dans l'élément d'objet dans les options de liste déroulante de sélection, cela fonctionne bien et il peut être validé en utilisant react-hook-form
:
<Form.Item ... >
<SpringSelect style={{ width: "200px" }} options={departments} placeholder="Department 2"
name="department2" onChange={e => {setValue("department2", e);}}/>
</Form.Item>
Cela fonctionne également avec le composant Controller
il n'affiche pas l'étiquette à l'intérieur de l'entrée de sélection:
<Controller as={<SpringSelect style={{ width: "200px" }} />}
placeholder="Department 1" name="department1" options={departments}
onChange={([e]) => {return { value: e };}} control={control} />
pour plus de détails, vérifiez le code complet dans l'aire de jeux codesandbox
La suppression de la valeur initiale innerProps
ne résoudra pas le problème dans le cas de la réinitialisation ou de la définition des valeurs initiales des formulaires (en utilisant reset ).
vous devez définir les accessoires value
et defaultValue
pour votre sélection personnalisée (SpringSelect
)
pour la sélection contrôlée cela fonctionnera correctement, pour la réinitialisation, mais pour les non contrôlés, vous devez utiliser la fonction watch
hook-form pour afficher les valeurs initiales
voir la boîte condeSande ci-dessous:
Lorsque le composant est à l'intérieur du contrôleur, un accessoire value
lui est envoyé. Et vous supprimez simplement les onChange
et onBlur
des accessoires.
Select
utilisera cette valeur de prop, mais c'est un objet, c'est pourquoi il n'affiche pas l'étiquette.
Pour réparer, vous pouvez simplement supprimer delete tmp.value;
avant d'ajouter les accessoires à innerProps
Exemple: https://codesandbox.io/s/vibrant-river-8r4dt
Je place un console.log
, comme vous pouvez le voir department1
a un champ value