-1
votes

Fonction invoquée ne renvoyant pas le résultat de réaction

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 commentaires

Veuillez poster le code complet de cette classe, book n'est pas défini


Pourquoi book.selectedbookname lorsque le paramètre est nommé regarder ( arr.Some (montre => {... )?


"the concat () est utilisé pour fusionner deux tableaux ou plus. Cette méthode ne modifie pas les matrices existantes , mais renvoie plutôt un nouveau tableau." / i>


3 Réponses :


0
votes

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});


2 commentaires

arr === Ceci.State.statewatchlist


Vous ne devriez pas changer directement l'état sans utiliser setstate



1
votes

La fonction .Some () Invoqué n'utilise pas le prédicat regarder pour tester avec chaque élément du tableau.

Il doit utiliser le prédicat pour tester avec chaque élément en modifiant watch à book comme suit: xxx

Comme @Andreas a signalé ci-dessous, la fonction arr.concat ne modifie pas la fonction Modifier l'état State.Selectedbooklist Array mais renvoie un nouveau. Vous devrez également définir ceci à l'état une fois qu'il est renvoyé à partir de .add comme suit: xxx

doit également let arr. Ceci.State.Selectedwatchlist; être this.state.electedbooklist ?


2 commentaires

Mais cela ne changera toujours pas le Selectedwatchlist 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); à 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.



0
votes

basé sur votre code de code:

ceci.state.stéwatchlist n'est pas défini dans ceci.state = {};

Je pense que vous utilisez cela.state.statewatchlist au lieu de cela. sélectionnéeListList

let arr = this.state.statewatchlist;


1 commentaires

Watch est la faute de frappe comme vous écrivez devrait être ceci.state. Bague sélectionnée