2017-12-28 5 views
0

Visual: Form I am using on the left, outputs on the rightReagieren abgebildet Checkbox alle der Array-Elemente zu wiederholen zurück, anstatt nur die, die ich

geprüft habe ich versuche, eine Checkbox Array Karte zu verwenden, in React Eigenschaften einer bestimmten Sache zu zeigen, aber wenn Ich drucke die Elemente aus, jedes Array-Element erscheint auf der Tabelle meiner Front-End-Webseite, nachdem ich mein Formular und meine Datenbank eingereicht habe und nicht nur die, die ich überprüft habe. Es wird alles in eine MongoDB-Datenbank zurückgemeldet, und das funktioniert gut (ich habe das geändert, indem ich geändert habe, was ich dort an eine einfache String-Eingabe sende), also bin ich überzeugt, dass das Mapping das Problem ist. Vielen Dank!

Constructor:

constructor(props) { 
    super(props); 
    this.state = { 
     name: '', 
     price: '', 
     location: ['Back Bay', 'Downtown Crossing'], 
     description: '', 
     features: [ 
      'Pet-Free', 'Climate-Controlled', 'Locked Area', 'Private Entrance', 'Smoke Detectors', 'Smoke Free' 
     ], 
    }; 

     this.onInputChange = this.onInputChange.bind(this); 

    this.addListingService = new ListingService(); 
    this.handleSubmit = this.handleSubmit.bind(this); 
} 

Und hier ist mein Mapping:

<div>What cool features does this storage space have?</div> 
    { 
    this.state.features.map((features) => { 
       return <CheckBox key={features} title={features} name="features" /> 
      }) 
       } 

Edit:

Ich habe auch versucht eine onInputChange() Funktion zu verwenden, um zu sehen, ob es das auslösen würde, so nur die Checkbox-Optionen, die ich überprüft habe, würden auf meiner Frontend-Seite und meiner Datenbank erscheinen, aber das schien nicht zu helfen. Ich habe ein Foto beigefügt, das die Form, die ich verwende, und die Ausgaben zeigt. Hier ist die Funktion:

 onInputChange(event) { 
     const target = event.target; 
     const value = target.type === 'checkbox' ? target.checked : target.value; 
     const name = target.name; 

     this.setState({ 
      [name]: value, 
     }); 
    } 

Edit 2:

ich jetzt versuchen, Keymapping wie unten vorgeschlagen, aber ich erhalte eine Fehlermeldung mit der ObjectKeys Funktion. Der Fehler Ich erhalte sagt „Typeerror:. Object.assign (...) Filter ist keine Funktion“

Object.keys(this.state.features).map(key =>({...this.state.features[key],title:key} 
            .filter(features=>features.checked) 
            .map(features => <CheckBox key={features} title={features} onChange = {this.onInputChange} />))) 
+0

Ich verstehe es nicht. Willst du damit nicht verhindern, dass ungeprüfte gerendert werden? Wenn ja, wo ist diese bedingte Logik? Ihr Mapping rendert nur ein Element pro Array ohne Bedingung. – Jayce444

+0

Yup! Ich will nur, dass es diejenigen zurückmeldet, die ich überprüft habe, dann werden sie in meine Datenbank eingegeben und ich kann sie auf meiner Seite auflisten. – user9148237

+0

Ich habe zuvor versucht, onChange {this.onInputChange} zu tun, aber das schien nicht zu helfen. Hier ist diese Funktion: onInputChange (Ereignis) { const target = event.target; const value = Zieltyp === 'Checkbox'? target.checked: Ziel.Wert; const name = Zielname; this.setState ({ [Name]: Wert, }); } – user9148237

Antwort

0

Wenn Sie nur bestimmte Elemente eines Arrays zeigen wollen, können Sie Array.prototype.filter verwenden

this.state.features 
    .filter(features=>features.checked) 
    .map(feature => <CheckBox key={feature.id} title={feature.title} name="features" />) 

Dadurch werden nur Kontrollkästchen für die von Ihnen geprüften Elemente angezeigt. Wenn Sie true zum Filtern zurückgeben, wird das Element beibehalten, false nicht. Hinweis: Dadurch wird das ursprüngliche Array nicht geändert. Meine Methode erfordert jedoch, dass Sie Ihre Daten leicht umstrukturieren. Vielleicht möchten Sie eine Reihe von Funktionen, die wie folgt aussieht

[ 
    {id:1,title:'Pet-Free',checked:true}, 
    {id:2,title:'Climate-Controlled',checked:false}, 
    // ...etc 
] 
+0

Ich gebe dir eine Chance und lass es dich wissen, vielen Dank! – user9148237

+0

Ich habe mein Problem vielleicht nicht so gut artikuliert, wie ich es beabsichtigt habe, das Problem ist, dass, wenn ich 3/6 Punkte überprüfe, alle 6 gegen vs. nur die 3 erscheinen, die ich möchte. Ich habe Ihre Lösung und alle Funktionen getestet: true show up, egal ob sie überprüft werden oder nicht, anstatt nur zu erscheinen, wenn ich sie physisch auf meiner Frontendseite überprüfe. Ich hatte sowohl ID 1 als auch 2 als geprüft: true, und sie erschienen auf meiner Front-End-Seite und in meiner Datenbank als [Objekt Objekt], [Objekt Objekt]. Lass es mich wissen, wenn das mein Problem klärt, danke nochmal! – user9148237

+0

Können Sie mir erklären, wo das Kontrollkästchen als aktiviert markiert ist oder nicht? Vielleicht würde ich deine Antwort mit dem Code von CheckBox bearbeiten, der helfen könnte. –

Verwandte Themen