如何从父母改变孩子的状态

时间:2018-01-15 20:54:13

标签: javascript reactjs

我是Reacts的新手。我看了很多帖子,但找不到解决问题的方法。

任务: 这样,在每个<td>内都有一个“修改”按钮,通过点击该文章可以使用其中显示的<td>编辑此<input />的文字。

父:

import React, { Component } from 'react';
import BehaviorInput from './BehaviorInput';

class BehaviorTable extends Component {
    constructor(props){
        super(props);
        this.state = {
            users: [
                {name: 'Коля', age: 30},
                {name: 'Вася', age: 40}
            ],
            status: false
        }
    }
    handlerEdit = (key, value) => {
        if (isNaN(value)){
            this.state.users[key].name = value;
        }else{
            this.state.users[key].age = value;
        }
        this.setState({
            'users': this.state.users,
        });
    };
    render(){
        return(
            <table>
                <tbody>
                {this.state.users.map((item, index) => (
                    <tr key={index}>
                        <td>
                            {item.name}
                            <BehaviorInput
                                status={this.state.status}
                                value={item.name}
                                index={index}
                                editFn={this.handlerEdit}
                            />
                        </td>
                        <td>
                            {item.age}
                            <BehaviorInput
                                status={this.state.status}
                                value={item.age}
                                index={index}
                                editFn={this.handlerEdit}
                            />
                        </td>
                    </tr>
                ))}
                </tbody>
            </table>
        )
    }
}
export default BehaviorTable;

儿童:

import React, { Component } from 'react';
class BehaviorInput extends Component {
    constructor(props){
        super(props);
        this.state = {
            'status': this.props.status,
            'value': this.props.value
        }
    }
    callChangeName(event){
        this.setState({
            'value': event.target.value
        });
    }

    handlerChange(){
        this.setState({'status': !this.state.status});
    }
    render(){
        return(
            <p>
                {(this.state.status) ?
                    <input type="text"
                           value={this.state.value}
                           onChange={this.callChangeName.bind(this)}
                           onBlur={this.props.editFn.bind(null, this.props.index, this.state.value)}
                    />:
                    <button
                        onClick={this.handlerChange.bind(this)}
                    >Edit</button>
                }
            </p>
        )
    }
}

export default BehaviorInput;

我不明白如何从父组件中更改子组件中的状态? 也许我认为错了。请给我一个关于我的问题的建议。

2 个答案:

答案 0 :(得分:0)

我最近遇到了类似的问题,我想根据父母点击按钮来改变孩子。单击的按钮位于父级的render方法中,同时还包含单击处理程序,子级道具将从父级状态传递给子级。这样孩子会自动更新,虽然它不是一个正在更新的状态,我不这么认为。我没有用过很长时间的反应 - 所以任何人都可以随意纠正我。我在这里有一个codepen来演示我的意思,点击一周中的任何一天更新详细视图。

https://codepen.io/Macpeters/pen/dJZoLM

父母有一周(数组)和一天。每天的任何一天都会被点击,更新日期。然后它将一天传递给详细信息组件

   <div>  
      <h1>7 Day Weather Forcast:</h1>
       {week.map(function(day, index){
          return <span key={ index }>
            <a href="#"
              onClick={(e) => handleClick(e, index)}
              ><Card day={day}/></a></span>;
       })}
      <div><DetailedCard day={week[details]}/></div>
    </div>

然后,细节组件引用其道具中的那一天

   <div>
    <h3>Detailed Forecast for {this.props.day.date} </h3>
    <span><img src={this.props.day.image} /> 
    High of {this.props.day.high}, Low of {this.props.day.low}</span>
    <p>{this.props.day.description}</p>
  </div> 

答案 1 :(得分:0)

我找到了解决问题的决定。 在子组件中添加新功能在子组中改变状态并调用其他功能。

changeCall() {
        this.handlerChange();
        this.props.editFn(this.props.index, this.state.value, this.props.objectKey);
    }