鍍金池/ 問(wèn)答/HTML/ Cannot read property 'state' of undefine

Cannot read property 'state' of undefined

UserAdd.js

import React from 'react';
import UserProvider from './UserProvider';

class UserAdd extends React.Component {
    handleSubmit (e) {
        e.preventDefault();

        const {form: {name, age, gender}, formValid} = this.props;


    }
    render () {
        const {form: {name, age, gender}, onFormChange} = this.props;
        return (
            <div>
                <header>
                    <h1>添加用戶</h1>
                </header>

                <main>
                    <form onSubmit={(e) => this.handleSubmit(e)}>
                        <label>用戶名:</label>
                        <input
                            type="text"
                            value={name.value}
                            onChange={(e) => onFormChange('name', e.target.value)}
                        />
                        <br/>
                        <label>年齡:</label>
                        <input
                            type="number"
                            value={age.value || ''}
                            onChange={(e) => onFormChange('age', +e.target.value)}
                        />
                        <br/>
                        <label>性別:</label>
                        <select
                            value={gender.value}
                            onChange={(e) => onFormChange('gender', e.target.value)}
                        >
                            <option value="">請(qǐng)選擇</option>
                            <option value="male">男</option>
                            <option value="female">女</option>
                        </select>
                        <br/>
                        <br/>
                        <input type="submit" value="提交"/>
                    </form>
                </main>
            </div>
        )

    }
}

UserAdd = UserProvider({
    name: {
        defaultValue: '王子'
    },
    age: {
        defaultValue: 0
    },
    gender: {
        defaultValue: '男'
    }
})(UserAdd);

export default UserAdd;

UserProvider.js

import React from 'react';
/*
{
    name: {
        defaultValue: '王子'
    },
    age: {
        defaultValue: 0
    },
    gender: {
        defaultValue: '男'
    }
}
 */
function userProvider (fields) {
    return function (Comp) {

        const initialFormState = {};
        for (const key in fields) {
            initialFormState[key] = {
                value: fields[key].defaultValue,
                error: ''
            };
        }
        /*
         initialFormState = {
            name: {
                value: '王子',
                error: ''
            }
         }
         */

        class UserComponent extends React.Component {
            constructor (props) {
                super(props);
                this.state = {
                    form: initialFormState,
                    formValid: false
                };
                console.log('初始化的狀態(tài)')
                console.log(initialFormState)
            }

            handleValueChange (fieldName, value) {
                const { form } = this.state;

                // var form = this.state.form;


                const newFieldState = {value, valid: true, error: ''};

                const newForm = {...form, [fieldName]: newFieldState};

                console.log('newForm')
                console.log(newForm)



                const formValid = Object.values(newForm).every(f => f.valid);

                this.setState({
                    form: newForm,
                    formValid
                });
            }

            render () {
                const {form, formValid} = this.state;
                return (
                    <Comp {...this.props} form={form} onFormChange={this.handleValueChange}/>
                )
            }
        }

        return UserComponent;
    }
}

export default userProvider;

圖片描述

回答
編輯回答
脾氣硬
render() {
       const { form, formValid } = this.state;
       return (
         <Comp
           {...this.props}
           form={form}
           onFormChange={this.handleValueChange.bind(this)}
         />
       );
     }

this丟失啦,改成這樣 onFormChange={this.handleValueChange.bind(this)}就好啦

先去了解一下這個(gè):React ES6 class 中的this 綁定的幾種方式

仔細(xì)讀 react 文檔,這些問(wèn)題文檔都寫(xiě)的很清楚

2017年5月4日 22:55