Fehlgeschlagener Formular-PropType: Sie haben einem Formularfeld ohne einen "onChange" -Handler einen "Wert" -Prop bereitgestellt


71

Wenn ich meine Reaktions-App lade, wird dieser Fehler in der Konsole angezeigt.

Warnung: Fehlgeschlagenes Formular propType: Sie haben valueeinem Formularfeld ohne onChangeHandler eine Requisite bereitgestellt . Dadurch wird ein schreibgeschütztes Feld gerendert. Wenn das Feld veränderlich sein soll, verwenden Sie defaultValue. Andernfalls stellen Sie entweder onChangeoder ein readOnly. Überprüfen Sie die Rendermethode von AppFrame.

Meine AppFrame-Komponente befindet sich unten:

class AppFrame extends Component {
    render() {
        return (
            <div>
                <header className="navbar navbar-fixed-top navbar-shadow">
                    <div className="navbar-branding">
                        <a className="navbar-brand" href="dashboard">
                            <b>Shire</b>Soldiers
                        </a>
                    </div>
                    <form className="navbar-form navbar-left navbar-search alt" role="search">
                        <div className="form-group">
                            <input type="text" className="form-control" placeholder="Search..."
                                   value="Search..."/>
                        </div>
                    </form>
                    <ul className="nav navbar-nav navbar-right">
                        <li className="dropdown menu-merge">
                            <span className="caret caret-tp hidden-xs"></span>
                        </li>
                    </ul>
                </header>

                <aside id="sidebar_left" className="nano nano-light affix">

                    <div className="sidebar-left-content nano-content">

                        <ul className="nav sidebar-menu">
                            <li className="sidebar-label pt20">Menu</li>
                            <li className="sidebar-label">
                                <IndexLink to="/" activeClassName="active">Dashboard</IndexLink>
                            </li>
                            <li className="sidebar-label">
                                <Link to="/fixtures" activeClassName="active">Fixtures</Link>
                            </li>
                            <li className="sidebar-label">
                                <Link to="/players" activeClassName="active">Players</Link>
                            </li>
                        </ul>

                    </div>

                </aside>
                <section id="content_wrapper">
                    <section id="content" className="table-layout animated fadeIn">
                        {this.props.children}
                    </section>
                </section>
            </div>

        )
    }
}

export default AppFrame;

Ich kämpfe darum herauszufinden, was ich hier eigentlich falsch mache. Die Anwendung startet und funktioniert, aber ich versuche, alle Konsolenwarnungen / -fehler zu entfernen.

Antworten:


114

Sie haben einen Wert direkt in Ihre Sucheingabe eingegeben. Ich sehe den Vorteil dort nicht, da Sie bereits einen Platzhalter haben. Sie können den Wert entweder entfernen aus:

<input type="text" className="form-control" placeholder="Search..." value="Search..."/>

dazu:

<input type="text" className="form-control" placeholder="Search..." />

Oder wenn Sie denken, dass Sie es haben müssen, stellen Sie es ein als defaultValue:

<input type="text" className="form-control" placeholder="Search..." defaultValue="Search..."/>

Dokumentation: https://facebook.github.io/react/docs/uncontrolled-components.html#default-values


1
Hat jemand diesen Fehler mit einem Submit-Button bekommen? Das ergibt für mich keinen Sinn. Für input type="submit", valuewird erwartet , dass Sie den Text liefern. Warum sollte dieser Fehler in diesem Fall angezeigt werden?
— Martavis P.

@MartavisP. nicht sicher, aber Sie könnten <button type="submit>Your value in here</button>stattdessen verwenden.
— Jolvera

Ich schäme mich. Ich hatte meinen Code tatsächlich durcheinander gebracht, um diese Nachricht zu erhalten. Alles ist ffffiiiinnnneeee :-)
— Martavis P.

2
Für mich funktioniert es nicht und ich verstehe nicht warum, ich sehe bereits viele und viele
— Beiträge

@ Tryliom Könnten Sie eine jsfiddle oder etwas erstellen, um Ihren Fehler zu reproduzieren?
— Jolvera

25

Wenn Sie dem Benutzer den Eingabewert nicht über dieses Eingabefeld entnehmen, müssen Sie dieses Feld schreibgeschützt machen, indem Sie den Standardwert festlegen .

Für den Fall, dass Sie den Wert festlegen und Benutzerinteraktion einbeziehen möchten. Sie sollten das Ereignis onChange senden , um den Status des Anfangswertes zu aktualisieren. Dies ist wie eine Zweiwegebindung als Winkelstütze.

state = {
   keyword: 'test' 
} 

inputChangedHandler = (event) => {
    const updatedKeyword = event.target.value;
    // May be call for search result
}

render() {
  return (
      <input 
         type="text" 
         placeholder="Search..."
         value={this.state.keyword} 
         onChange={(event)=>this.inputChangedHandler(event)} />
   );
} 

2
Wie ändert das Festlegen des aktualisierten Schlüsselworts im Änderungshandler die Anzeige im Eingabefeld?
— Dan Meigs

@ DanMeigs Diese Zeile macht nichts. Sie können buchstäblich nur eine leere onChange-Handler-Methode verwenden, die einwandfrei funktioniert.
— Mike

1
Ich bin sicher, sie haben ihre Gründe, es so zu gestalten, aber es macht für mich keinen Sinn.
— Mike

3

Die Warnung wird angezeigt, weil Sie ein Wertattribut für die Eingabe festlegen und keinen Handler zum Aktualisieren bereitstellen. Es gibt zwei Möglichkeiten, dies zu tun:

  1. Sie können eine Referenz verwenden , um Formularwerte aus dem DOM abzurufen.

    https://reactjs.org/docs/uncontrolled-components.html

  2. Setzen Sie die onChange- Handler-Funktion.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.