代码之家  ›  专栏  ›  技术社区  ›  Ivan Pintar

SetState未在反应组件中触发

  •  0
  • Ivan Pintar  · 技术社区  · 10 年前

    我正在使用react、redux和es2015开发一个todo应用程序。我刚刚介绍了react引导程序,我的简单输入控件没有按预期工作。 代码如下:

    import React from 'react'
    import { connect } from 'react-redux'
    import { addTodo } from '../actions'
    import { FormGroup, ControlLabel, Input, FormControl } from 'react-bootstrap'
    
    class AddTodo extends React.Component {
        constructor(props) {
            super(props);
    
            this.handleChange = this.handleChange.bind(this);
            this.submit = this.submit.bind(this);
    
            this.state = {
                value: ''
            }
        }
    
        handleChange(e) {
            this.setState({ value: e.target.value }); // WORKS
        }
    
        submit() {        
            this.props.dispatch(addTodo(this.state.value)); // WORKS
            this.setState({ value: '' });  // FAILS
        }
    
        render() {     
            return (
                <FormGroup>
                    <ControlLabel>Add Todo</ControlLabel>
                    <FormControl 
                        type='text' 
                        onChange={this.handleChange}
                        onBlur={this.submit}/>           
                </FormGroup>
            );
        }
    }
    
    AddTodo = connect()(AddTodo);
    
    export default AddTodo;
    

    如上所述,submit方法中的setState()调用应该将输入重置为空值,但该调用不起作用,输入只保留最后键入的内容。 控制台中也没有错误或警告。

    我显然在这里遗漏了一些东西,但我就是想不出是什么。

    谢谢

    2 回复  |  直到 10 年前
        1
  •  1
  •   Brad Colthurst    10 年前

    看起来您的表单控件未连接到您在状态中跟踪的值。将值属性添加到 <FormControl />

    像这样:

    <FormControl 
        type='text'
        value={this.state.value}  <-- Yay value updates!
        onChange={this.handleChange}
        onBlur={this.submit}/>  
    

    **还将假定onBlur是您的故意行为。

        2
  •  0
  •   omarjmh    10 年前

    首先在另一个变量中获取值,然后将状态设置为“”,然后分派:

    submit() {        
        let val = this.state.value;
        this.setState({ value: '' });  
        this.props.dispatch(addTodo(val)); 
    }