2016-05-09 10 views
1

Ich richte ein einfaches Anmeldeformular mit react ein und verwende einen onChange-Handler, um den Status zu aktualisieren. Das vom OnChange-Handler erfasste Ereignisargument ist eine Zeichenfolge und kein Objekt.Reaction onChange-Ereignis gibt kein Objekt zurück

deshalb ist nicht in der Lage i event.target.value oder Ereignis event.target Ereignis

Schlüsselwörter meiner getippt zugreifen

dies ist der relevante Code-Schnipsel einfach ergibt.

class SignUp extends Component{ 

    constructor(props){ 
    super(props); 
    this.state = { 
     username:'', 
     password:'' 
    } 
    this.handleChange = this.handleChange.bind(this) 
    } 

    handleChange(event){ 
    this.setState({...this.state,[event.target.name]:event.target.value}) 

    } 

    render(){ 
    const signUp = this.props.signUp; 
    return(
    <form> 
     <Card className={style.SignUpCard}> 
     <CardTitle 
      title="Sign Up" 
      /> 
      <CardActions> 
      <Input type="text" label="username" value={this.state.username} placeHolder="Pick a username" maxLength={16} onChange={this.handleChange} name="username" value={this.state.username}/> 
      </CardActions> 
      <CardActions> 
      <Input type="password" label="password" value={this.state.password} placeHolder="password" onChange={this.handleChange} name="password" value={this.state.password}/> 
      </CardActions> 
      <CardActions> 
      <Button label="Sign Up" raised primary onClick={() => signUp(this.state.username,this.state.password)}/> 
      </CardActions> 
     </Card> 
    </form> 
    ) 
    } 
} 

export default SignUp; 

meine Fehler in der Konsole

Uncaught TypeError: Cannot read property 'name' of undefined 

das Eingabefeld ist eine Reaktion-Toolbox Komponente

class Input extends React.Component { 
    static propTypes = { 
    children: React.PropTypes.any, 
    className: React.PropTypes.string, 
    disabled: React.PropTypes.bool, 
    error: React.PropTypes.string, 
    floating: React.PropTypes.bool, 
    hint: React.PropTypes.string, 
    icon: React.PropTypes.oneOfType([ 
     React.PropTypes.string, 
     React.PropTypes.element 
    ]), 
    label: React.PropTypes.string, 
    maxLength: React.PropTypes.number, 
    multiline: React.PropTypes.bool, 
    onBlur: React.PropTypes.func, 
    onChange: React.PropTypes.func, 
    onFocus: React.PropTypes.func, 
    onKeyPress: React.PropTypes.func, 
    required: React.PropTypes.bool, 
    type: React.PropTypes.string, 
    value: React.PropTypes.any 
    }; 

    static defaultProps = { 
    className: '', 
    hint: '', 
    disabled: false, 
    floating: true, 
    multiline: false, 
    required: false, 
    type: 'text' 
    }; 

    handleChange = (event) => { 
    if (this.props.onChange) this.props.onChange(event.target.value, event); 
    }; 

    blur() { 
    this.refs.input.blur(); 
    } 

    focus() { 
    this.refs.input.focus(); 
    } 

    render() { 
    const { children, disabled, error, floating, hint, icon, 
      label: labelText, maxLength, multiline, required, 
      type, value, ...others} = this.props; 
    const length = maxLength && value ? value.length : 0; 
    const labelClassName = ClassNames(style.label, {[style.fixed]: !floating}); 

    const className = ClassNames(style.root, { 
     [style.disabled]: disabled, 
     [style.errored]: error, 
     [style.hidden]: type === 'hidden', 
     [style.withIcon]: icon 
    }, this.props.className); 

    const valuePresent = value !== null && value !== undefined && value !== '' && !Number.isNaN(value); 

    const InputElement = React.createElement(multiline ? 'textarea' : 'input', { 
     ...others, 
     className: ClassNames(style.input, {[style.filled]: valuePresent}), 
     onChange: this.handleChange, 
     ref: 'input', 
     role: 'input', 
     disabled, 
     required, 
     type, 
     value, 
     maxLength 
    }); 

    return (
     <div data-react-toolbox='input' className={className}> 
     {InputElement} 
     {icon ? <FontIcon className={style.icon} value={icon} /> : null} 
     <span className={style.bar}></span> 
     {labelText 
      ? <label className={labelClassName}> 
       {labelText} 
       {required ? <span className={style.required}> * </span> : null} 
      </label> 
      : null} 
     {hint ? <span className={style.hint}>{hint}</span> : null} 
     {error ? <span className={style.error}>{error}</span> : null} 
     {maxLength ? <span className={style.counter}>{length}/{maxLength}</span> : null} 
     {children} 
     </div> 
    ); 
    } 
} 

export default Input; 
+0

können Sie Ihre Eingangskomponente hinzufügen? – QoP

+0

sorry .. ich verstehe nicht .. das ist die Eingabekomponente .. du meinst das Protokoll? – Kannaj

+0

Ich meinte die Input-Komponente, die Sie in CardActions erhalten haben. Ist das nicht eine Komponente? – QoP

Antwort

1

der Nach react-toolbox documentation,

Ihre handleChange wie diese

aussehen sollte
handleChange = (name, value) => { 
    this.setState({...this.state, [name]: value}); 
}; 

und Ihre onChange

onChange={this.handleChange.bind(this,'fieldName'} 

beispiels für Passwort sollte es so sein

<Input onChange={this.handleChange.bind(this,'password'} type="password" label="password" value={this.state.password} placeHolder="password" name="password" value={this.state.password}/> 
+0

danke .. sah die Dokumentation früher, aber wusste nicht, dass die Bindung der Name hätte solch eine drastische Wirkung:/.. funktioniert jetzt – Kannaj

Verwandte Themen