【问题标题】:React is not changing the state of the parent elementReact 不会改变父元素的状态
【发布时间】:2018-08-12 02:37:21
【问题描述】:

我正在 react 中构建简单的待办事项应用程序,并且我已将输入字段作为 inputForm 元素的一部分,该元素是子元素。

我可以毫无问题地将函数作为道具从父级传递给子级,但我无法更新父级状态以在输入字段上存储值。当我在输入字段中输入时,传递的函数正常执行,但 currentTodo 状态没有更新。

我发现使用单一数据流模式(如 Flux 或 Reflux)可以避免这个问题,但由于这是我的第一个项目,我想了解如何使用基础知识。

父元素代码:

import React, { Component } from 'react';
import './App.css';
import InputForm from '../components/InputForm'
import {Task} from '../components/Task'

class App extends Component {

    constructor(){
        super();
        this.state = {
            tasks: ["Todo", "Toda"],
            currentToDo: "",
        };
    }


//makes copy of task array, pushes current to do to copy and setsState 
//with new values
    addTodo = () => {
        console.log("addTodo")
        let copy = this.state.tasks.slice();
        console.log(this.state.currentToDo)
        copy.push(this.state.currentToDo);
        this.setState({tasks: copy});
    }

//gets input value from input field and updates current todo
    onInputChange = e => {
        console.log(e.target.value);
        this.setState({ currentTodo: e.target.value })
    }

  render() {
      let drawTask = this.state.tasks.map(e => {
          return <Task todo={e}/>
      })

    return (
        <div className="container">
            <InputForm onInputChange={() => this.onInputChange} add={this.addTodo}/>
            {drawTask}
        </div>
    );
  }
}

export default App;

子元素的代码:

import React, { Component } from 'react';
import './component.css';
import {AddButton} from './Buttons.js'

class InputForm extends Component{
    constructor(){
        super();
        this.state = {

        }
    }

    render(){
        return(
            <div className='taskHeader'>
 {/*Value of current todo is send as props from parent element*/}
                <input value = {this.props.currentToDo} onChange={this.props.onInputChange()} type="text"/>
                <AddButton add = {this.props.add}/>
            </div>
        )
    }
}

export default InputForm;

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您在渲染期间调用函数而不是传递引用。

    父母拥有该功能,需要将其传递给孩子:

    &lt;InputForm onInputChange={this.onInputChange} add={this.addTodo}/&gt;

    现在孩子有一个名为 onInputChange 的道具,您可以将它作为参考传递给 onChange 回调。

    &lt;input value={this.props.currentToDo} onChange={this.props.onInputChange} type="text"/&gt;

    【讨论】:

    • 当我尝试不使用 () 时,函数 onInputChange 根本不会执行。
    • 在您的父组件中执行 onInputChange={this.onInputChange}。传递引用,以便 onChange 回调可以执行它。您无需将其包装在匿名函数中。
    • @Austris 也,如果这个答案对你有帮助,请投票并检查为正确答案。
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 2018-06-22
    • 2020-05-03
    • 2020-08-17
    • 2018-06-02
    • 1970-01-01
    • 2016-05-24
    • 2020-08-27
    相关资源
    最近更新 更多