0
votes

TypeError: this.state.persons.map n'est pas une fonction merci

Je suis nouveau pour réagir et seulement comprendre les bases. J'ai eu ce projet de quelqu'un à regarder, mais je me gratte ma tête depuis le matin avec ce problème:

import React, { useState, Component } from 'react';
import './App.css';
import Person from './Person/Person';
import person from './Person/Person';
import { render } from '@testing-library/react';

class App extends Component {
   state =
   {
    persons:[
    {id: '123', name:'Max', age: 28 },
    {id: '124',name:'Mari', age: 26 },
    {id: '125',name: 'laly', age: 20 }

  ],
  showPersons: false 
  }

nameChangeHandler=( event,id ) =>
{ const personIndex = this.state.persons.findIndex(p=>{
  return p.id === id;
});

const person = {...this.state.persons[personIndex]
};
person.name=event.target.value;
const persons=[ ...this.state.persons];
persons[personIndex]=person;
  this.setState(
    {
      persons:person
    }
  )
}

togglePersonHandler =  ()=>
{
const doesShow = this.state.showPersons;
this.setState ({showPersons: !doesShow});
}

deletePersonHandler= (personIndex)=> {
//const persons = this.state.persons;
const persons = [...this.state.persons]
persons.splice(personIndex,1);
this.setState({persons:persons});
}
  render()
{
  const style ={
    backgroundColor:'yellow',
    font:'inherit',
    border:'1px solid blue',
    padding:'8px',
    cursor:'pointer'
  };

  let persons=null;
  if (this.state.showPersons){
   persons= (
   <div>
    {this.state.persons.map((person,index)=> {return <Person click={() => this.deletePersonHandler(index)}
    name = {person.name} 
    age = {person.age} 
    key={person.id}
    change ={(event) => this.nameChangeHandler(event,person.id)}
     />
     })};
  </div>)

  };

 return (

  <div className="App">
      <h1>Hi This is react App</h1>
      <button style={style} onClick={this.togglePersonHandler}> Toggle Persons</button>

       {persons}


    </div>
  ); 
    }
    }

export default App;


1 commentaires

Dans NamechangeHandler , vous avez une faute de frappe. Il devrait être this.setstate ({personnes: personnes}) avec un supplémentaire . Ou juste this.setstate ({personnes}) pour utiliser le raccourci


4 Réponses :


0
votes

erreur est ici:

nameChangeHandler=( event,id ) =>
{ const personIndex = this.state.persons.findIndex(p=>{
  return p.id === id;
});

const person = {...this.state.persons[personIndex]
};
person.name=event.target.value;
const persons=[ ...this.state.persons];
persons[personIndex]=person;
  this.setState(
    {
      persons:person    ------------ > You are assigning a single object to a list in your state, so your map is giving an error, it must be {persons: persons}
    }
  )
}


0 commentaires

0
votes

Chaque fois que vous voyez ___ n'est pas une fonction , essayez de regarder quelle que soit la fonction se référant à.

Dans ce cas, vous utilisez mapper , qui est une fonction de tableau. Vous devez donc vérifier si le tableau (la chose à gauche du point) est en fait un tableau.

L'appel de la fonction:

this.state.persons.map

Le tableau Vous devez faire attention à IS Personnes . Alors essayez de rechercher la place dans le code où personnes ne reçoit pas un tableau.


0 commentaires

0
votes

Vous avez une faute de frappe ici, vous vous attribuez et objectez à l'état à la place d'un tableau. Dans le Funcion Namechangehandler . xxx

avec une console simple à l'intérieur du rendu ou juste la regarder dans le menu des composants dans le navigateur, vous pouvez le remarquer bro.

 Entrez la description de l'image ici


0 commentaires

0
votes

Cela se produit probablement ici, où vous remplacez la matrice de personnes avec une seule personne:

this.setState({persons});


0 commentaires