J'ai 2 fonctions on invoque une autre. La fonction intérieure invoquée Ajouter est en train de vérifier si dans ceci.state.ste.electedbooklist code> existe BookName code> obtenu à partir d'un champ de saisie, s'il n'existe pas son addition BookName code> à this.state.state.electedbooklist code>, sinon retourne à la fonction invoquée par. Mais j'ai le problème que le résultat de book.selectedbookname === bookname code> est toujours faux. Cela ne peut pas être, et mon arrêté est à la fin toujours vide. Quel que soit un chèque, ce qui ne va pas? import React, { Component } from 'react';
import EnteredBooks from '.././components/EnteredBooks/EnteredBooks';
class App extends Component {
constructor(props) {
super(props)
this.state = {
bookName: '',
bookDescription: '',
bookUrl: '',
bookPrice: '',
enteredBookList: [],
selectedBookId: '',
selectedBookName: '',
selectedBookDescription: '',
selectedBookUrl: '',
selectedBookPrice: '',
selectedBookList: [],
activeIndex: '',
}
}
submitHandler = (event) => {
event.preventDefault();
let bookId = Math.floor((Math.random() * 100) + 1);
let bookName = this.state.bookName;
let bookDescription = this.state.bookDescription;
let bookUrl = this.state.bookUrl;
let bookPrice = this.state.bookPrice;
this.setState({
enteredBookList: this.state.enteredBookList.concat({bookId, bookName, bookDescription, bookUrl, bookPrice})
})
}
add = (bookName, bookUrl, bookDescription, bookPrice, index) => {
let arr = this.state.selectedBookList;
let found = arr.some(book => {
return book.selectedBookName === bookName;
});
if (!found) {
return arr.concat({bookName, bookUrl, bookDescription, bookPrice, index});
}
console.log(found);
}
selectedBookHandler = (bookName, bookUrl, bookDescription, bookPrice, index) => {
let arr = this.add(bookName, bookUrl, bookDescription, bookPrice, index);
this.setState({
selectedBookName: bookName,
selectedBookUrl: bookUrl,
selectedBookDescription: bookDescription,
selectedBookPrice: bookPrice,
selectedBookId: index
});
console.log(this.state.selectedBookList);
}
render() {
const enteredBooks = this.state.enteredBookList.map((enteredBook, index) => {
const active = this.state.activeIndex;
return <EnteredBooks
key={index}
enteredBook={enteredBook}
active={index === active}
selected={this.selectedBookHandler.bind(this, enteredBook, enteredBook.bookName, enteredBook.bookUrl,
enteredBook.bookDescription, enteredBook.bookPrice, index)}
/>
});
return (
<div className="App">
<div className="add-product">
<form>
<div>
<label>Product name:</label>
<input
type="text"
placeholder="Book"
value={this.state.BookName || ''}
onChange={event => this.setState({bookName: event.target.value})}
/>
</div>
<div>
<label>Product description:</label>
<textarea
placeholder="Sample description..."
value={this.state.bookDescription || ''}
onChange={event => this.setState({bookDescription: event.target.value})}
>
</textarea>
</div>
<div>
<label>Product image:</label>
<input
type="text"
placeholder="http://...jpg"
value={this.state.bookUrl || ''}
pattern="https?://.+" required
onChange={event => this.setState({bookUrl: event.target.value})}
/>
</div>
<div>
<label>Product price:</label>
<input
type="number"
min="0"
placeholder="20.5"
value={this.state.bookPrice || ''}
onChange={event => this.setState({bookPrice: event.target.value})}
/>
</div>
<button
type="submit"
onClick={event => this.submitHandler(event)}
>
Add a new Task
</button>
</form>
</div>
<div className="list-products">
<ul>
{enteredBooks}
</ul>
</div>
</div>
);
}
}
export default App;
3 Réponses :
Lorsque vous ajoutez un livre et que vous n'avez pas trouvé, vous vous concatéez-vous à votre tableau contextuel Art code> au lieu de votre sélectionnéeWatchlist code>. return this.state.selectedWatchList.concat({bookName, bookUrl, bookDescription, bookPrice, index});
arr === Ceci.State.statewatchlist code>
Vous ne devriez pas changer directement l'état sans utiliser setstate code>
La fonction Il doit utiliser le prédicat pour tester avec chaque élément en modifiant Comme @Andreas a signalé ci-dessous, la fonction doit également .Some () code> Invoqué n'utilise pas le prédicat regarder code> pour tester avec chaque élément du tableau. watch code> à book code> comme suit: p> arr.concat code> ne modifie pas la fonction Modifier l'état State.Selectedbooklist Code> Array mais renvoie un nouveau. Vous devrez également définir ceci à l'état une fois qu'il est renvoyé à partir de .add code> comme suit: p> let arr. Ceci.State.Selectedwatchlist; code> être this.state.electedbooklist code>? p> p> p>
Mais cela ne changera toujours pas le Selectedwatchlist code> mais c'est ce qu'il faut s'attendre, au moins c'est ce que je pense à cause de la console.log (this.state.electedbook); code> à la fin
Watch est une faute de frappe, comme vous l'avez écrit Anderas, cela ne changera pas et j'en ai besoin de changer.
basé sur votre code de code: p>
Je pense que vous utilisez cela.state.statewatchlist au lieu de cela. sélectionnéeListList P>
ceci.state.stéwatchlist n'est pas défini dans ceci.state = {}; code> p>
let arr = this.state.statewatchlist; code> p>
Watch est la faute de frappe comme vous écrivez devrait être ceci.state. Bague sélectionnée
Veuillez poster le code complet de cette classe,
book code> n'est pas définiPourquoi
book.selectedbookname code> lorsque le paramètre est nomméregarder code> (arr.Some (montre => {... code>)?"the
concat () code> est utilisé pour fusionner deux tableaux ou plus. Cette méthode ne modifie pas les matrices existantes b>, mais renvoie plutôt un nouveau tableau." / i>