Anpassen Salar Antwort auf JSX und React, ist mir aufgefallen, dass sich React Select nicht wie eine <input/>
Feld für die Validierung. Offenbar sind mehrere Umgehungslösungen erforderlich, um nur die benutzerdefinierte Meldung anzuzeigen und zu verhindern, dass sie zu ungünstigen Zeiten angezeigt wird.
Ich habe ein Problem angesprochen aquí falls das etwas hilft. Hier ist eine CodeSandbox mit einem funktionierenden Beispiel, und der wichtigste Code dort ist hier wiedergegeben:
Hallo.js
import React, { Component } from "react";
import SelectValid from "./SelectValid";
export default class Hello extends Component {
render() {
return (
<form>
<SelectValid placeholder="this one is optional" />
<SelectValid placeholder="this one is required" required />
<input
required
defaultValue="foo"
onChange={e => e.target.setCustomValidity("")}
onInvalid={e => e.target.setCustomValidity("foo")}
/>
<button>button</button>
</form>
);
}
}
SelectValid.js
import React, { Component } from "react";
import Select from "react-select";
import "react-select/dist/react-select.css";
export default class SelectValid extends Component {
render() {
this.required = !this.props.required
? false
: this.state && this.state.value ? false : true;
let inputProps = undefined;
let onInputChange = undefined;
if (this.props.required) {
inputProps = {
onInvalid: e => e.target.setCustomValidity(this.required ? "foo" : "")
};
onInputChange = value => {
this.selectComponent.input.input.setCustomValidity(
value
? ""
: this.required
? "foo"
: this.selectComponent.props.value ? "" : "foo"
);
return value;
};
}
return (
<Select
onChange={value => {
this.required = !this.props.required ? false : value ? false : true;
let state = this && this.state ? this.state : { value: null };
state.value = value;
this.setState(state);
if (this.props.onChange) {
this.props.onChange();
}
}}
value={this && this.state ? this.state.value : null}
options={[{ label: "yes", value: 1 }, { label: "no", value: 0 }]}
placeholder={this.props.placeholder}
required={this.required}
clearable
searchable
inputProps={inputProps}
ref={input => (this.selectComponent = input)}
onInputChange={onInputChange}
/>
);
}
}
2 Stimmen
Oh, +1 für die irrsinnige Meldung zur Validierung des leeren Passworts =/ Wie hat das die QA bestanden, frage ich mich...
7 Stimmen
Warum akzeptieren Sie nicht einfach die Standardmeldung des Browsers? Das sehen die Benutzer bei jeder anderen Website, die sie besuchen. Sie verwirren Ihre Benutzer nur, indem Sie eine nicht standardisierte Meldung erstellen. (Google hat wahrscheinlich mehr UX-Evaluierung und -Tests durchgeführt, um diesen Wortlaut festzulegen, als Sie selbst).
18 Stimmen
@ChrisV Was ist mit mehrsprachigen Websites?
4 Stimmen
In meinem Fall möchte ich prüfen, ob es sich bei dem Wert um eine Zahl handelt, bevor ich ihn abschicke, aber ich kann das Attribut type="number" nicht verwenden (aus Gründen). Also habe ich das Attribut pattern so eingestellt, dass es auf Zahlen und optionale Dezimalstellen prüft, was im Fehlerfall die Meldung "Please match the requested format," ausgibt. Mir wäre es lieber, wenn es hieße: "Du musst uns eine Zahl schenken, Junge.