Nehmen Sie Todolist als BeispielDas Verzeichnis lautet wie folgtapp.jsimportiere React, { PureComponent } von 'react' Eingabe aus „./components/Input“ importieren Liste aus „./components/List“ importieren importiere Total aus './components/Total' Importiere Maske aus „./components/Mask“ importiere { bus als $bus } von './components/bus' importiere './App.css' exportiere Standardklasse App erweitert PureComponent { Konstruktor() { super() dieser.Zustand = { Flagge: falsch, Liste: [ { ID: 1, Inhalt: 'Hahaha', geprüft: false }, { Ich würde: 7, Inhalt: 'Hahaha', geprüft: false }, { ID: 5, Inhalt: 'Hahaha', geprüft: false }, ], checkAll: false, Länge auswählen: 0, Artikel: {} } } // Alles auswählen oder Auswahl aller abwählen checkAllHandler(checked) { console.log("geprüft",geprüft); const { list } = dieser.Zustand const neueListe = Liste.Map(Element =>{ returniere {...item,checked} }) dies.setState({Liste:neueListe,checkAll:geprüft},()=>{ dies.doneLength() }) } // Einzelauswahl, Einzelauswahl checkHandler =(id,checked)=> { const { list } = dieser.Zustand const neueListe = Liste.Map(Element => { returniere item.id === ID ? {...item,checked} : Artikel }) let checkAll = neueListe.Länge und neueListe.jedes(Element => Element.geprüft) this.setState(() => ({Liste: neueListe,allesprüfen}),()=>{ dies.doneLength() }) } // hinzufügen addHandler = (obj)=>{ lass { Liste } = diesen.Zustand; let neueListe = [...Liste,Objekt] console.log('neueListe===='+neueListe) dies.setState({ Liste: neueListe, },()=>{ dies.doneLength() }) } // Suche searchHandler=(content)=>{ console.log("Inhalt",Inhalt); lass { Liste } = diesen.Zustand; let newList = Liste.Filter(Element => Element.Inhalt.Includes(Inhalt)) dies.setState({ Liste: neueListe },()=>{ dies.doneLength() }) } // Löschen delHandler = (id)=> { Konsole.log("Ich würde",Ich würde); const { list } = dieser.Zustand const newList = Liste.Filter(Artikel => Artikel.ID !=ID) let checkAll = neueListe.Länge und neueListe.jedes(Element => Element.geprüft) this.setState(() => ({Liste: neueListe,allesprüfen}),()=>{ dies.doneLength() }) } // Bearbeiten editHandler = (items)=>{ dies.setState({ Artikel: Artikel }) } // Update update = (Inhalt)=>{ const { Liste, Element } = dieser.Zustand let obj = Objekt.assign(item,{content}) const neueListe = Liste.map(v => { wenn(v.id === obj.id) { v = {...obj} } zurückgeben v }) dies.setState({ Liste: neueListe, Artikel: obj }) } // Abgeschlossen doneLenth=()=> { const { list } = dieser.Zustand const newList = Liste.Filter(Element => Element.geprüft) let selectLength = neueListe.Länge setzeTimeout(()=>{ dies.setState({ Länge auswählen }) }) } // Komponente einbindenDidMount() { this.unSubscribe = $bus.addListener("getFlag",(flag)=>{ dies.setState({flag}) }) this.unSubscribe1 = $bus.addListener("sendValue",(obj)=>{ this.addHandler(obj) }) this.unSubscribe2 = $bus.addListener("Suchwert",(Wert)=>{ this.searchHandler(Wert) }) this.unSubscribe3 = $bus.addListener("getItem",(item)=>{ this.editHandler(Element) }) this.unSubscribe4 = $bus.addListener("update",(content)=>{ dies.update(Inhalt) }) } // Aushängen componentWillUnmount() { $bus.removeListener(dieses.abbestellen) $bus.removeListener(dieses.unSubscribe1) $bus.removeListener(dieses.unSubscribe2) $bus.removeListener(dieses.unSubscribe3) $bus.removeListener(dieses.unSubscribe4) } rendern() { let { flag, list, checkAll, selectLength } = dieser.Zustand zurückkehren ( <div Klassenname='Container'> {/* Eingabefeld*/} <Eingabe></Eingabe> {/* Liste */} <Liste Liste={Liste} checkHandler={dieser.checkHandler} delHandler={dieser.delHandler}></Liste> {/* Statistik */} <Gesamt checkAllHandler={this.checkAllHandler.bind(this)} checkAll={checkAll} selectLength={selectLength}></Gesamt> {/* Popup-Fenster bearbeiten */} { Flagge ? <Maske ></Maske> : ''} </div> ) } } Eingabe.jsimportiere React, {Komponente} von 'react' importiere { bus als $bus } von './bus' exportiere Standardklasse Input erweitert Komponente { Konstruktor() { super() dieser.Zustand = { Wert:"" } } changeHandler = (e)=>{ dies.setState({ Wert: e.Ziel.Wert }) console.log("dieser.Zustands.Wert",dieser.Zustands.Wert); } // addHandler hinzufügen = ()=>{ lass { Wert } = diesen.Zustand; lass obj = { ID: Date.now(), Inhalt: Wert, erledigt: falsch } wenn(Wert) { $bus.emit("Sendewert",obj) } anders { console.log("Bitte eingeben") } } // Suche searchHandler = ()=>{ console.log("Suche"); lass { Wert } = diesen.Zustand; if(!value) return console.log("Bitte eingeben"); $bus.emit("Suchwert",Wert) } rendern() { let { value } = dieser.Zustand zurückkehren ( <> <div Klassenname="Eingabe"> <input type="text" value={value} placeholder='Bitte geben Sie Ihren Aufgabennamen ein und drücken Sie zur Bestätigung die Eingabetaste' onInput={this.changeHandler}/> <button className="btn btn-success" onClick={this.addHandler}>Hinzufügen</button> <button className="btn btn-primary" onClick={this.searchHandler}>Suchen</button> </div> </> ) } } Liste.jsimportiere React, {Komponente} von 'react' Element aus „./Item“ importieren Importiere PropTypes aus „Prop-Types“ exportiere Standardklasse Liste erweitert Komponente { statische Eigenschaftentypen = { Liste:PropTypes.array.isRequired, } rendern() { let { Liste, checkHandler, checkAllHandler, delHandler } = this.props; console.log("Liste",Liste); zurückkehren ( <ul Klassenname="Aufgabenliste"> { Liste.map(Element => (<Elementelement={Element} Schlüssel={Element.id} checkHandler={checkHandler} checkAllHandler={checkAllHandler} delHandler={delHandler}></Element>)) } </ul> ) } } Artikel.jsimportiere React, {Komponente} von 'react' importiere { bus als $bus } von './bus' exportiere Standardklasse Item erweitert Komponente { Konstruktor(Requisiten) { super(Requisiten) dieser.Zustand = {} } ÄnderungsHandler = (id)=>{ let { checkHandler } = diese.props; Rückkehr (e)=>{ checkHandler(id,e.ziel.geprüft) } } entferneHandler(){ } = this.props; delHandler(Argumente[0]) } editHadnler = (Artikel)=>{ $bus.emit("getFlag",true) localStorage.setItem("obj",JSON.stringify(item)) $bus.emit("getItem",Artikel) } rendern() { } = diese.Eigenschaften; zurückkehren ( <li Klassenname="Aufgabenelement"> <input type="checkbox" aktiviert={item.checked} beiÄnderung={this.changeHandler(item.id)}/> <div Klassenname="Inhalt"> {item.content} </div> <button className={`btn btn-success ${!item.checked ? "d-none" : "d-block"}`} onClick={()=> this.editHadnler(item)}>Bearbeiten</button> <button className={`btn btn-danger ${!item.checked ? "d-none" : "d-block"}`} onClick={this.removeHandler.bind(this,item.id)}>Löschen</button> </li> ) } } Gesamt.jsimportiere React, {Komponente} von 'react' exportiere Standardklasse Total erweitert Komponente { Konstruktor() { super() dies.changeAllHandler = dies.changeAllHandler.bind(dies) } changeAllHandler(e) { let { checkAllHandler } = diese.props checkAllHandler(e.target.geprüft) } rendern() { let { checkAll,selectLength } = diese.props; zurückkehren ( <div Klassenname="Aufgabe erledigt"> <input type="checkbox" onChange={this.changeAllHandler} aktiviert={checkAll}/> <p>Abgeschlossen<span className="single-number">{selectLength}</span> Alle<span className="all-number">4</span></p> </div> ) } } Mask.js (Popup-Fenster)importiere React, {Komponente} von 'react' importiere { bus als $bus } von './bus' exportiere Standardklassenmaske erweitert Komponente { Konstruktor() { super() dieser.Zustand = { Wert: '' } } closeMask = ()=>{ // Popup-Fenster schließen$bus.emit("getFlag",false) } updateHandler = ()=>{ $bus.emit("getFlag",false) $bus.emit("aktualisieren",dieser.Zustand.Wert) } beiÄnderung = (e) => { dies.setState({ Wert: e.Ziel.Wert }) } componentDidMount() { let obj = JSON.parse(localStorage.getItem("obj")) dies.setState({ Wert: obj.content }) } rendern() { let { value } = dieser.Zustand zurückkehren ( <div> <div Klassenname="mm-Maske" > <div Klassenname="mm-modal"> <div Klassenname="mm-Titel"> <span className="mm-edit">Bearbeiten</span> <span className="mm-close" onClick={this.closeMask}>x</span> </div> <div Klassenname="mm-Inhalt"> <input type="text" value={value} placeholder="Aufgabenname" onInput={this.onChange}/> </div> <div Klassenname="mm-box-btn"> <div className="mm-update" onClick={this.updateHandler}>Aktualisieren</div> <div className="mm-cancel" onClick={this.closeMask}>Abbrechen</div> </div> </div> </div> </div> ) } } bus.jsyarn add -D Ereignisse importiere { EventEmitter } von 'Ereignisse' export const bus = new EventEmitter() // Businstanz exportieren App.css* { Rand: 0; Polsterung: 0; } Eingabe,Schaltfläche { Gliederung: keine; Rand: 0; } ul>li { Listenstil: keiner; } .container { Breite: 400px; Höhe: 500px; Rand: 10px automatisch automatisch; Polsterung: 20px; Box-Größe: Rahmenbox; Farbe: #3333; Rand: 1px durchgezogen; Überlauf: versteckt; } .Eingabe { Breite: 100 %; Höhe: 30px; Anzeige: Flex; } Eingabe { Breite: 100 %; Höhe: 100%; Rand: 1px durchgezogen #e1e1e1; Box-Größe: Rahmenbox; Rahmenradius: 4px; Polsterung: 0 10px; } Eingabe::Platzhalter { Farbe: #e1e1e1; } Eingabe:Fokus { Rand: 1px durchgezogen #0096e6; } .Aufgabenliste { Breite: 100 %; Anzeige: Flex; Flex-Flow: Spaltenumbruch; Rand oben: 10px; } .Aufgabenliste li { Anzeige: Flex; Höhe: 40px; Inhalt ausrichten: zentriert; Elemente ausrichten: zentrieren; Polsterung: 0 10px; Hintergrundfarbe: #eef0f4; Rand unten: 10px; Überlauf: versteckt; Textüberlauf: Auslassungspunkte; Leerzeichen: Nowrap; } .task-list li Eingabe[Typ^="Kontrollkästchen"] { Breite: 15px; Höhe: 15px; Rand: 1px durchgezogen #e1e1e1; Cursor: Zeiger; Flex-Schrumpfen: 0; } .Aufgabenliste li .Inhalt { biegen: 1; Rand links: 10px; } .btn { Flex-Schrumpfen: 0; Anzeige: Flex; Elemente ausrichten: zentrieren; Höhe: 30px; Inhalt ausrichten: zentriert; Polsterung: 5px 10px; Textausrichtung: zentriert; Cursor: Zeiger; Rahmenradius: 4px; Farbe: #fff; Buchstabenabstand: 2px; Rand: 0,5px; Box-Größe: Rahmenbox; Schriftgröße: 16px; } .btn-Erfolg { Hintergrundfarbe: #0f0; } .btn-Gefahr { Hintergrundfarbe: #f00; } .btn-primary { Hintergrundfarbe: #0096e6; } .Aufgabe erledigt { Breite: 100 %; Höhe: 40px; Zeilenhöhe: 40px; Anzeige: Flex; Elemente ausrichten: zentrieren; Hintergrundfarbe: #eef0f4; Polsterung links: 10px; Box-Größe: Rahmenbox; Rand oben: 30px; } .task-done Eingabe { Breite: 15px; Höhe: 15px; Rand: 1px durchgezogen #e1e1e1; Cursor: Zeiger; Flex-Schrumpfen: 0; Rand rechts: 10px; } .einzelne-Zahl { Farbe: #333; Rand links: 5px; } .alle-Nummer { Farbe: rot; Rand links: 5px; } .mm-Maske{ Position: fest; oben: 0; links: 0; rechts:0; unten: 0; Hintergrund: rgba (0,0,0,0,5); } .mm-modal{ Breite: 350px; Position: absolut; oben: 50 %; links: 50 %; transformieren: übersetzen(-50 %, -50 %); z-Index: 1000; Hintergrund:#ffffff; Rahmenradius: 4px; Farbe: #333333; } .mm-Titel { Höhe: 50px; Zeilenhöhe: 50px; Anzeige: Flex; Inhalt ausrichten: Abstand dazwischen; Rahmen unten: 1px durchgezogen #e1e1e1; Boxgröße: Rahmenbox; Schriftgröße: 20px; } .mm-bearbeiten{ Texteinzug: 20px; } .mm-schließen{ Rand rechts: 20px; Schriftfamilie: Consals; Cursor:Zeiger; } .mm-Inhalt{ Polsterung: 0 20px; Rand unten: 20px; } .mm-Inhaltseingabe{ Breite: 100 %; Höhe: 30px; Zeilenhöhe: 30px; Texteinzug: 20px; Rahmenradius: 4px; Rand oben: 20px; Rand: 1px durchgezogen #666; Boxgröße: Rahmenbox; } .mm-content input:hover{ Rand: 1px durchgezogen #0096e6; } .mm-Inhaltseingabe: letztes Kind { Texteinzug: 5px; } .mm-box-btn{ Anzeige: Flex; } .mm-update,.mm-cancel{ Breite: 80px; Höhe: 30px; Zeilenhöhe: 30px; Textausrichtung: zentriert; Cursor:Zeiger; Hintergrund: #0096e6; Farbe: #ffffff; Benutzerauswahl: keine; Rahmenradius: 4px; Rand: 0 20px 50px; } .mm-update{ Rand rechts: 10px; } .d-keine { Anzeige: keine; } .d-block { Anzeige: Block; } ZusammenfassenDieser Artikel endet hier. Ich hoffe, er kann Ihnen helfen. Ich hoffe auch, dass Sie mehr Inhalt auf 123WORDPRESS.COM lesen können! Das könnte Sie auch interessieren:
|
<<: Nachteile und sinnvolle Verwendung des MySQL-Datenbankindex
>>: Was ist eine HTML-Datei? So öffnen Sie eine HTML-Datei
Wie lösche ich Umgebungsvariablen unter Linux? Ve...
Der datetime-Typ wird normalerweise zum Speichern...
Das Auswahlelement erstellt ein Einzelauswahl- ode...
Eine Mehrfachauswahl ist ein Benutzeroberflächene...
1.vue-Verpackung Hier verwenden wir den Befehl „v...
Inhaltsverzeichnis 1. Einleitung 2. Umgebung und ...
Domänenübergreifende Lösungen jsonp (get simulier...
Inhaltsverzeichnis 1. Ursache 2. Geräteinformatio...
Vor kurzem hatte ich zufällig Kontakt mit dem Pro...
Übersicht zur Netzwerkkommunikation Bei der Entwi...
Harbor ist ein Registry-Server auf Unternehmenseb...
Hintergrund Vor nicht allzu langer Zeit habe ich ...
<br />Ein toller Blogbeitrag von PPK vor zwe...
In diesem Artikelbeispiel wird der spezifische Co...
Die Entwicklung der Docker-Technologie bietet ein...