Wie kann man Eingabewerte mit React.JS richtig validieren?

Ich habe eine einfache Form. Alle Komponenten und der Status befinden sich in der Seitenkomponente. Es gibt 2 Kopfzeilen und 3 Eingabefelder. Die erste Eingabe soll Text sein, und die zweite und dritte sollen Ints sein. Wenn der Benutzer den falschen Datentyp eingibt, soll neben dem Eingabefeld eine Fehlermeldung angezeigt werden. 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 an die Komponente zurückzuleiten, die den Status enthält. Bedeutet dies, dass nur Page bestimmen kann, ob ein Wert gültig ist?

Wie soll ich dann das Popup anzeigen lassen? Sollte Page ein neues boolesches Statuselement auslösen müssen, das perp durchläuft und Adaptive_Input anweist, die Fehlermeldung anzuzeigen?

JSFiddle

JS:

/**
 * @jsx React.DOM
 */
var Adaptive_Input = React.createClass({ 
    handle_change: function(){
        var new_text = this.refs.input.getDOMNode().value;
        this.props.on_Input_Change(new_text);
    },
    render: function(){
        return (
                <div className='adaptive_placeholder_input_container'>
                    <input 
                        className="adaptive_input"
                        type="text" 
                        required="required" 
                        onChange= {this.handle_change}
                        ref="input"
                    ></input>
                    <label
                        className="adaptive_placeholder"
                        alt={this.props.initial}
                        placeholder={this.props.focused}
                    ></label>
                </div>              
                );
    }
});

var Form = React.createClass({
    render: function(){
        return (
                <form>
                    <Adaptive_Input
                        initial={'Name Input'}
                        focused={'Name Input'}
                        on_Input_Change={this.props.handle_text_input}
                    />
                    <Adaptive_Input
                        initial={'Value 1'}
                        focused={'Value 1'}
        ,                on_Input_Change={this.props.handle_value_1_input}
                    />
                    <Adaptive_Input
                        initial={'Value 2'}
                        focused={'Value 2'}
                        on_Input_Change={this.props.handle_value_2_input}
                    />
                </form>
                );
    }
});

var Page = React.createClass({
    getInitialState: function(){
        return {
            Name : "No Name",
            Value_1 : '0',
            Value_2 : '0',
            Display_Value: '0'
        };
    },
    handle_text_input: function(new_text){
        this.setState({
                Name: new_text
            });
    },
    handle_value_1_input: function(new_value){
        console.log("===");
        var updated_display = parseInt(new_value) + parseInt(this.state.Value_2);
        updated_display = updated_display.toString();
        this.setState({
                Display_Value: updated_display 
            });
    },
    handle_value_2_input: function(new_value){
        var updated_display = parseInt(this.state.Value_1) + parseInt(new_value);
        updated_display = updated_display.toString();
        this.setState({
                Display_Value: updated_display
            });
    },
    render: function(){
        return(
                <div>
                    <h2>{this.state.Name}</h2>
                    <h2>Value 1 + Value 2 = {this.state.Display_Value}</h2>
                    <Form
                        handle_text_input={this.handle_text_input}
                        handle_value_1_input = {this.handle_value_1_input}
                        handle_value_2_input = {this.handle_value_2_input}
                    />
                </div>
        );
    }
});

React.renderComponent(<Page />, document.body);

Antworten auf die Frage(7)

Ihre Antwort auf die Frage