Wie kann man Eingabewerte mit React.JS richtig validieren?
Lesezeit: 15 Minuten
Ich habe ein einfaches Formular. Alle Komponenten und Zustände werden in der Page-Komponente gespeichert. Es gibt 2 Anzeigeköpfe und 3 Eingabefelder. Die erste Eingabe soll Text sein, und die zweite und dritte sollen Ints sein. Wenn der Benutzer den falschen Datentyp eingibt, möchte ich, dass neben dem Eingabefeld eine Fehlermeldung angezeigt wird. Meine Fragen beziehen sich auf Best Practices in React.JS
Wer entscheidet, dass der Wert gültig ist? Ich nehme an, dass die einzige Aufgabe des Eingabefelds darin besteht, den Wert zurück an die Komponente zu leiten, die den Status enthält. Bedeutet dies also, dass nur Page feststellen kann, ob ein Wert gültig ist?
Wie soll ich dann das Popup erscheinen lassen? Sollte Page ein neues boolesches Zustandselement auslösen, das durch Perp geleitet wird, das Adaptive_Input anweist, die Fehlermeldung anzuzeigen?
Wie kann man Eingabewerte mit React.JS richtig validieren?
Wie auch immer du willst. React dient zum Rendern eines Datenmodells. Das Datenmodell sollte wissen, was gültig ist oder nicht. Sie können Backbone-Modelle, JSON-Daten oder alles andere verwenden, um die Daten und ihren Fehlerzustand darzustellen.
Genauer:
React ist im Allgemeinen agnostisch gegenüber Ihren Daten. Es dient zum Rendern und Behandeln von Ereignissen.
Die zu befolgenden Regeln sind:
Elemente können ihren Zustand ändern.
Sie können keine Requisiten ändern.
Sie können einen Rückruf aufrufen, der die Requisiten der obersten Ebene ändert.
Wie entscheidet man, ob etwas eine Requisite oder ein Zustand sein soll? Bedenken Sie Folgendes: Würde irgendein Teil Ihrer App außer dem Textfeld wissen wollen, dass der eingegebene Wert falsch ist? Wenn nein, machen Sie es zu einem Zustand. Wenn ja, sollte es eine Stütze sein.
Wenn Sie beispielsweise möchten, dass eine separate Ansicht “Sie haben 2 Fehler auf dieser Seite” rendert. dann müsste Ihr Fehler einem Toplevel-Datenmodell bekannt sein.
Wo soll dieser Fehler wohnen?
Wenn Ihre App beispielsweise Backbone-Modelle rendert, hätte das Modell selbst eine validate()-Methode und eine validateError-Eigenschaft, die Sie verwenden könnten. Sie könnten andere intelligente Objekte rendern, die dasselbe tun könnten. React sagt auch, dass man versuchen sollte, Requisiten auf ein Minimum zu beschränken und den Rest der Daten zu generieren. Wenn Sie also einen Validator (z https://github.com/flatiron/revalidator) dann könnten Ihre Validierungen heruntersickern und jede Komponente könnte Requisiten mit ihrer übereinstimmenden Validierung überprüfen, um zu sehen, ob sie gültig ist.
Es liegt weitgehend an Ihnen.
(Ich bin persönlich Verwenden von Backbone-Modellen und Rendern in React. Ich habe eine Fehlerwarnung der obersten Ebene, die ich zeige, wenn irgendwo ein Fehler auftritt, und den Fehler beschreibe.)
„React sagt auch, versuche Requisiten auf ein Minimum zu beschränken“ – Weißt du, wo React dies dokumentiert?
– Mark Lundin
10. Juli 2014 um 14:11 Uhr
„Finden Sie heraus, was die absolute Minimaldarstellung des Zustands Ihrer Anwendung sein muss, und berechnen Sie alles andere, was Sie benötigen, bei Bedarf.“ facebook.github.io/react/docs/thinking-in-react.html Schritt 3
– Mark Bolusmjak
10. Juli 2014 um 14:48 Uhr
Sollte es nicht heißen “React sagt auch, versuche, den Zustand auf ein Minimum zu beschränken”?
– Mose Lee
8. April 2015 um 17:13 Uhr
@MosesLee Die Verwendung von Requisiten anstelle des Komponentenstatus hält den Status pro Komponente auf einem Minimum. Das Berechnen abgeleiteter Werte in Renderaufrufen, anstatt sie zu speichern, hält Requisiten (und Status) auf einem Minimum. Wir versuchen, den Zustand in beiden Richtungen auf ein Minimum zu beschränken, und die Requisiten im zweiten Sinne auf ein Minimum.
– Mark Bolusmjak
8. April 2015 um 17:21 Uhr
STAHL
Sie können verwenden npm install --save redux-form
Ich schreibe ein einfaches E-Mail- und Submit-Button-Formular, das die E-Mail validiert und das Formular absendet. Mit redux-form führt das Formular standardmäßig event.preventDefault() für die HTML-onSubmit-Aktion aus.
Na und? Die Leute kommen immer noch zu dieser Frage und wenn es einen neuen Ansatz gibt, um das Problem anzugehen, warum nicht? Redux oder nicht – es ist völlig gültig.
Die hier vorgeschlagene Lösung ist hackig, da ich versucht habe, sie nahe an der ursprünglichen jsfiddle zu halten. Überprüfen Sie für eine ordnungsgemäße Formularvalidierung mit React-form-with-constraints https://github.com/tkrotoff/react-form-with-constraints#examples
VISHAL DAGA
ich habe geschrieben Diese Bibliothek Damit können Sie Ihre Formularelementkomponenten umschließen und Ihre Validatoren im folgenden Format definieren:
<Validation group="myGroup1"
validators={[
{
validator: (val) => !validator.isEmpty(val),
errorMessage: "Cannot be left empty"
},...
}]}>
<TextField value={this.state.value}
className={styles.inputStyles}
onChange={
(evt)=>{
console.log("you have typed: ", evt.target.value);
}
}/>
</Validation>
Verwenden onChange={this.handleChange.bind(this, "name") Methode u value={this.state.fields["name"]} auf dem Eingabetextfeld und darunter ein Span-Element erstellen, um den Fehler anzuzeigen, siehe das folgende Beispiel.
Ich habe in der Vergangenheit Redux-Form und Formik verwendet, und kürzlich hat React Hook eingeführt, und ich habe einen benutzerdefinierten Hook dafür gebaut. Bitte überprüfen Sie es und sehen Sie, ob es Ihre Formularvalidierung viel einfacher macht.
Mit diesem Ansatz machen Sie auch keine kontrollierte Eingabe mehr.
Beispiel unten:
import React from 'react'
import useForm from 'react-hook-form'
function App() {
const { register, handleSubmit, errors } = useForm() // initialise the hook
const onSubmit = (data) => { console.log(data) } // callback when validation pass
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input name="firstname" ref={register} /> {/* register an input */}
<input name="lastname" ref={register({ required: true })} /> {/* apply required validation */}
{errors.lastname && 'Last name is required.'} {/* error message */}
<input name="age" ref={register({ pattern: /\d+/ })} /> {/* apply a Refex validation */}
{errors.age && 'Please enter number for age.'} {/* error message */}
<input type="submit" />
</form>
)
}
Przemek Strucinski
Manchmal können Sie mehrere Felder mit ähnlicher Validierung in Ihrer Anwendung haben. In einem solchen Fall empfehle ich, ein gemeinsames Komponentenfeld zu erstellen, in dem Sie diese Validierung aufbewahren.
Nehmen wir zum Beispiel an, dass Sie an einigen Stellen in Ihrer Anwendung obligatorische Texteingaben haben. Sie können eine TextInput-Komponente erstellen:
Das wäre eine gute Lektüre? christianalfoni.github.io/javascript/2014/10/22/…
– Rosdi Kasim
3. Juni 2015 um 3:10 Uhr
Wenn Sie Node verwenden, ist eine einfache Lösung die Verwendung von Reaktionsvalidierung von npm.
– Hexikel
8. April 2016 um 17:10 Uhr