【问题标题】:state is null after setting state in react [duplicate]在反应中设置状态后状态为空[重复]
【发布时间】:2017-06-23 16:16:06
【问题描述】:

我有一个 react 组件,它是一个简单的表单,我有一个函数可以查看任何表单元素是否发生变化,然后设置正在编辑的表单元素的状态。在我执行 console.log(this.state) 时的 handleChange 函数中,我看到了我所期望的确切内容,正确的键,例如(名称、团队名称等)以及我在表单中输入的值。

但是,当我单击提交并调用函数 nextStep 时,我收到一条错误消息,提示 this.state.name 为空,我在这里遗漏了什么吗?

这是我的组件。

var ReactDom = require('react-dom');
const uuid = require('uuid/v1');
import {postDataTest} from "../actions/postData";
import TeamSelectBox from "./TeamSelectBox";
import React, {Component, PropTypes} from "react";

class PlayerForm extends Component {

    constructor(props) {
            super(props);
            this.state = {
                name: '',
                teamName: '',
                bio: '',
                teamId: ''
            };
            this.handleChange = this.handleChange.bind(this);
        }

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

    nextStep(e) {
        e.preventDefault();
        // Get values via this.refs
        var player = {
            id: uuid(),
            name: this.state.name,
            teamName: this.state.teamName,
            bio: this.state.bio,
            teamId: this.state.teamId
         };

         postDataTest(player);
    }

    render() {
        return (
        <div className="row">
            <div className="col-md-6">
                <div className="panel">
                    <div className="panel-heading">
                        <h1>Add Player</h1>
                    </div>
                    <div className="panel-body">
                        <form className="form-horizontal">
                            <div className="form-group">
                                <label className="control-label">Name</label>
                                <input type="text" className="form-control" ref="name" defaultValue={this.state.name} onChange={this.handleChange.bind(this, 'name')}/>
                            </div>
                            <div className="form-group">
                                <label className="control-label">Team Name</label>
                                <input type="text" className="form-control" ref="teamName" defaultValue={this.state.teamName} onChange={this.handleChange.bind(this, 'teamName')}/>
                            </div>
                            <TeamSelectBox state={this.state.teamId} onChange={this.handleChange.bind(this, 'teamId')}/>
                            <div className="form-group">
                                <label className="control-label">Bio</label>
                                <input type="textarea" className="form-control" ref="bio" defaultValue={this.state.bio} onChange={this.handleChange.bind(this, 'bio')}/>
                            </div>
                            <div className="bs-component">
                                 <button className="btn btn-md btn-default btn-block" onClick={this.nextStep}>Save &amp; Continue</button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
        )
    }
}

module.exports = PlayerForm;

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    setState 不会立即改变状态,因此您必须使用callback in setState 来记录更新后的值

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

    您也没有绑定nextStep 函数。您应该在构造函数中或您喜欢的任何其他方式中执行此操作

    class PlayerForm extends React.Component {
    
        constructor(props) {
                super(props);
                this.state = {
                    name: '',
                    teamName: '',
                    bio: '',
                    teamId: ''
                };
                this.handleChange = this.handleChange.bind(this);
                this.nextStep = this.nextStep.bind(this);
            }
    
        handleChange(name, event) {
            this.setState({[name]: event.target.value});
            console.log(this.state);
        }
    
        nextStep(e) {
            e.preventDefault();
            // Get values via this.refs
            var player = {
                id: "9879",
                name: this.state.name,
                teamName: this.state.teamName,
                bio: this.state.bio,
                teamId: this.state.teamId
             };
    
             postDataTest(player);
        }
    
        render() {
            return (
            <div className="row">
                <div className="col-md-6">
                    <div className="panel">
                        <div className="panel-heading">
                            <h1>Add Player</h1>
                        </div>
                        <div className="panel-body">
                            <form className="form-horizontal">
                                <div className="form-group">
                                    <label className="control-label">Name</label>
                                    <input type="text" className="form-control" ref="name" defaultValue={this.state.name} onChange={this.handleChange.bind(this, 'name')}/>
                                </div>
                                <div className="form-group">
                                    <label className="control-label">Team Name</label>
                                    <input type="text" className="form-control" ref="teamName" defaultValue={this.state.teamName} onChange={this.handleChange.bind(this, 'teamName')}/>
                                </div>
                                
                                <div className="form-group">
                                    <label className="control-label">Bio</label>
                                    <input type="textarea" className="form-control" ref="bio" defaultValue={this.state.bio} onChange={this.handleChange.bind(this, 'bio')}/>
                                </div>
                                <div className="bs-component">
                                     <button className="btn btn-md btn-default btn-block" onClick={this.nextStep}>Save &amp; Continue</button>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
            )
        }
    }
    
    ReactDOM.render(<PlayerForm/>, document.getElementById('app'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>
    <div id="app"></div>

    【讨论】:

    • 得到完全相同的错误
    • 当我点击提交时,我得到“状态为空”,与我的相比,我看不到你在该代码中所做的更改
    • 我已经在 setState 回调函数中添加了 console.log(this.state),你还需要绑定 nextStep 函数
    • 检查我的更新答案
    • 你能解释一下为什么我必须在构造函数中绑定函数吗?谢谢!
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2020-10-18
    • 2021-11-12
    • 2017-01-18
    • 2019-08-09
    • 2021-07-20
    相关资源
    最近更新 更多