11493 sujets

JavaScript, DOM et API Web HTML5

Salut à tous, je suis en fin de projet et après beaucoup de temps passé à me casser la tête sur mon code je n'arrive pas à faire ce que je veux.
Au clic, barrer un seul produit de ma liste et non la totalité.


class ShoppingList extends Component {
  constructor(props) {
    super(props);

    this.state = {
      newItem: '',
      list: [],
    };

    this.doneItem = this.doneItem.bind(this);
  }

 updateInput(key, value) {
    // mettre à jour l'état du state
    this.setState({ [key]: value });
  }

  addItem() {
    // créer un nouvel élément avec un identifiant unique
    const newItem = {
      id: 1 + Math.random(),
      value: this.state.newItem.slice(),
    };

    // copier la liste actuelle des éléments
    const list = [...this.state.list];

    // ajouter un nouvelle élément à la liste
    list.push(newItem);

    // mettre à jour l'état avec une nouvelle liste. réinitialiser la nouvelle entrée d'éléments
    this.setState({
      list,
      newItem: '',
      done: false,
    });
  }
 deleteItem(id) {
    // filtrer l'élément en cours de suppression
    const updatedList = this.state.list.filter((item) => item.id !== id);
    this.setState({ list: updatedList });
  }

  doneItem() {
    this.setState((state) => ({
      done: !state.done,
    }));
  }

render() {
    return (
      <div>
        <div className="container">
          <div className="title">
            Ma liste de courses
          </div>
          <form>
            <input
              className="input"
              type="text"
              placeholder="Entrer un produit"
              value={this.state.newItem}
              onChange={(e) => this.updateInput('newItem', e.target.value)}
            />
            <button
              type="submit"
              className="add-btn btn-floating"
              onClick={() => this.addItem()}
              disabled={!this.state.newItem.length}
            >
              Ajouter
            </button>
          </form>
          <br />
          <ul>
            {this.state.list.map((item) => (
              <li
                className={this.state.done === false ? 'task' : 'task--done'}
                key={item.value}
                done={this.state.done}
              >
                {item.value}
                <button
                  type="submit"
                  className="btn btn-floating"
                  onClick={() => this.deleteItem(item.id)}
                >
                  <i className="material-icons">X</i>
                </button>
                <button
                  type="submit"
                  className="done-btn btn-floating"
                  onClick={() => this.doneItem(item.id)}
                >
                  <i className="material-icons">V</i>
                </button>
              </li>
            ))}
          </ul>
        </div>
      </div>

    );
  }
}

export default ShoppingList;




Merci
Modifié par AlBert86 (26 Jul 2020 - 22:37)
Modérateur
Et l'eau,

1. c'est pas malin de mettre des images sur le forum pour montrer ton code. Il y a des boutons d'éditions sujet. En l'état, ça donne pas envie....
2. Tu fais un gros composant. Or que ce soit en React ou Vue ou svelte, il est préférable de créer des minis composants qui s'imbriqueront.... Là, à vue de nez, je vois 4 à 5 composants.
Bonjour niuxe,
J'ai un peu mis d'eau dans mon vin, je ne sais pas si c'est mieux.
Je pensais vraiment que mettre les photos du code était plus digeste..
Mais bon j'avoue que même comme ça ça fait pavé, je m'en rend bien compte!
Pour l'histoire du gros composant, ma prof de spé m'a dit la même chose, mais étant partie dans ce délire là j'ai continué! J'aurai pu refaire la todo-list de cours en plusieurs composant, mais en galérant autant j'ai pas mal appris..
Modifié par AlBert86 (26 Jul 2020 - 22:38)