1
votes

Réagir useState avec la valeur de tableau par défaut ne se rend pas

Si j'utilise un nombre ou une chaîne comme valeur par défaut, il restitue l'application après l'utilisation de setVotes, tout comme avec setSelected. Avec le tableau, cela ne fonctionne pas (afficherait uniquement le tableau réel renouvelé après le rendu de la page, car il est facile de vérifier avec le bouton setSelected)

const App = (props) => {
  const [votes, setVotes] = useState([0,0,0,0,0,0])
  const [selected, setSelected] = useState(0)
  const handlenext = () => {
    setSelected(Math.floor(Math.random() * 6))
  }
  const handlevote = () => {
    let newvotes=votes
    newvotes[selected]+=1
    setVotes(newvotes)
  }
  return (
    <div>
      <button onClick={handlenext}> next anecdot</button>
      <p>{props.anecdotes[selected]}</p>
      <button onClick={handlevote}> vote</button>
      <p>votes {votes[selected]}</p>
    </div>
  )
}

const anecdotes = [
  'I',
  's',
  'T',
  'A',
  'l',
  '.'
]


0 commentaires

3 Réponses :


1
votes

essayez plutôt ceci

 const handlevote = () => {
    let newvotes= [...votes]
    newvotes[selected]+=1
    setVotes(newvotes)
  }


0 commentaires

0
votes

Vous devez créer un nouveau tableau. N'utilisez pas d'anciennes baies. Devriez-vous const a = [… b]


0 commentaires

0
votes

Vous devez passer une nouvelle référence. Les tableaux et les objets sont basés sur des références, si vous n'en créez pas un nouveau, c'est la même référence et ne réagissez pas en profondeur pour comparer les différences. De plus, vous mutez directement l'état, ce qui est mauvais.

Créez une nouvelle copie à partir de l'état const newvotes = [... votes] . Vous pouvez maintenant passer l’état suivant sans modifier l’original ni passer une nouvelle référence.


0 commentaires