reactjs / reactjs/react.dev

Conditionally controlled component with `value` and `defaultValue` properties

Ouverte
#3,407 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
JavaScript
Étoiles
11.8k
Forks
7.9k
Merge moyen
1 j 11 h
PR mergées (30 j)
11

Description

In our project codebase there is an uncontrolled component that allows you to specify an initial value with value property (code examples are simplified just to show an idea):


const CustomInput = ({ value = '', onChange }) => {
  const [uncontrolledValue, setUncontrolledValue] = useState(value);

  const handleChange = (e) => {
    setUncontrolledValue(e.target.value);
    if (onChange) {
      onChange(e.target.value);
    }
  }

  return <input value={uncontrolledValue} onChange={handleChange} />
}

This component is used inside the complex form (other input components in this form are controlled). Resetting the form causes problems with this particular component because it doesn't update the internal value on props change. There is the article that recommends 2 possible solutions:

  • rewrite component to be controlled one
  • trigger force rerender of the component using key property

IMO there is another option available - make component controlled/uncontrolled depending on existence value property:


const CustomInput = ({ value: controlledValue, defaultValue = '', onChange }) => {
  const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
  const isControlled = value !== undefined;
  const value = isControlled ? controlledValue : uncontrolledValue;

  const handleChange = (e) => {
    if (!isControlled) {
      setUncontrolledValue(e.target.value);
    }

    if (onChange) {
      onChange(e.target.value);
    }
  }

  return <input value={value} onChange={handleChange} />
}

This approach allows custom components to act as a standard <input /> element. I saw it in @kentcdodds video lesson and also in some popular libraries sources. But I can't find anything about such an approach in official react documentation. defaultValue is mentioned only here:

Should this approach be added as a recommendation in You Probably Don't Need Derived State or Forms article? If not are there any pitfalls to consider it as bad practice / anti-pattern?

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par la documentation « You Probably Don’t Need Derived State », « Forms » et « Uncontrolled Components » liée dans l’issue. Comparez ses recommandations actuelles avec le controlled/uncontrolled component pattern décrit ici, puis déterminez si une modification de la documentation est justifiée et où elle devrait se trouver.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, react
Domaine
documentation
Type d'issue
Documentation
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.