【问题标题】:Accessing child component's value访问子组件的值
【发布时间】:2018-12-09 20:28:27
【问题描述】:

我想从父组件访问子输入组件的值。我遵循了这个问题的答案:How to access child's state in React? 但它不起作用。当我输入文本时,输入字段没有更新,我收到了这个错误:

Uncaught TypeError: Cannot read property 'setState' of undefined
        at onFieldsChange (bundle.js:28511)
        at HTMLUnknownElement.callCallback (bundle.js:2807)
        at Object.invokeGuardedCallbackDev (bundle.js:2845)
        at Object.invokeGuardedCallback (bundle.js:2894)
        at Object.invokeGuardedCallbackAndCatchFirstError (bundle.js:2908)
        at executeDispatch (bundle.js:3173)
        at executeDispatchesInOrder (bundle.js:3195)
        at executeDispatchesAndRelease (bundle.js:3293)
        at executeDispatchesAndReleaseTopLevel (bundle.js:3304)
        at Array.forEach (<anonymous>)

更新:我通过在LoginForm 中使用onFieldsChange 的箭头功能修复了控制台错误,但在我输入文本时字段仍未更新。

这是我的LoginForm,它是父组件:

import React, { Component } from 'react';
import Button from '../Recyclable/Button';
import AlertBar from '../Recyclable/AlertBar';
import InputGroup from '../Recyclable/InputGroup';
import {connect} from 'react-redux';
import { bindActionCreators } from 'redux';

export default class LoginForm extends Component {
    constructor (props) {
        super(props);
        this.state = {
            username: '',
            password: '',
            rememberMe: false,
            submitting: false
        };
    }

    onChangeCheckBox = (event) => {
        this.setState({  [event.target.name]: event.target.checked });
    };

    validateLoginForm = (username,password) => {
        if(username.length >= 0 && password.length >= 0){
            return true;
        }
        this.props.loginError = {
            message: 'All fields are required'
        }
        return false;       
    }

    onSubmit = (event) =>  {
        event.preventDefault();
        console.log('submitted');
        let { username, password } = this.state;
        console.log(username, password);
        if(this.validateLoginForm(username,password)) {
            this.props.login(username, password);
        }
        this.setState({
            username: '',
            password: ''
        });
    }

    onFieldsChange = (fieldId, value) => {
        console.log([fieldId]);
        this.setState({ [fieldId]: value });
    }

    render() {
        const { loginError } = this.props;
        return (
            <div className="container">
                <div className="login-container">
                    <div id="output">{loginError}</div>
                    <div className="avatar"></div>
                    <h3>Login</h3>
                    <div className="form-box">
                        <form onSubmit={this.onSubmit} >
                            <InputGroup 
                                name="username" 
                                type="text" 
                                placeholder="username" 
                                onChange={this.onFieldsChange}
                                value={this.state['username']}
                            />
                            <InputGroup 
                                name="password" 
                                type="password" 
                                placeholder="password" 
                                onChange={this.onFieldsChange} 
                                value={this.state['password']} 
                            />
                            <div className="small-text"></div>
                            <div className="small-text" >
                                <a href="#">Forgot password?</a>
                            </div>
                            <Button buttonLabel="Login" />
                        </form>

                    </div>
                </div>
            </div>
        );
    }
}

这是我的InputGroup,它是子组件:

import React, {Component} from 'react';

export default class InputGroup extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event) {
    const text = event.target.value;
    console.log('props name', this.props.name);
    this.props.onChange(this.props.name, text);
  }

  render() {
    return (
      <div className="input-group">
        <input onChange={this.handleChange} value={this.props.value} {...this.props} />
      </div>
    );
  }
}

【问题讨论】:

    标签: reactjs input web-applications login onchange


    【解决方案1】:

    这个lexical scope issue.User arrow function

     onFieldsChange=(fieldId, value) =>{
                console.log([fieldId]);
                this.setState({ [fieldId]: value });
            }
    

    check here了解更多信息。

    【讨论】:

    • 感谢您的回答。它确实修复了控制台错误。但是当我输入时,我的输入字段仍然没有更新。
    • 您没有将name 属性分配给您的输入控件。 ` `
    • 但我有 {...this.props},我将它作为道具传递给 LoginForm 内的 InputGroup?
    猜你喜欢
    • 1970-01-01
    • 2019-11-11
    • 2023-03-27
    • 2019-08-30
    • 2016-12-24
    • 2017-11-12
    • 2019-01-17
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多