将子组件的状态传递给父组件?

Posted

技术标签:

【中文标题】将子组件的状态传递给父组件?【英文标题】:Passing the state of a Child component to a Parent? 【发布时间】:2019-04-02 11:52:14 【问题描述】:

我想我知道我需要做什么才能使我的searchLocationChange 功能正常工作,但我不确定该怎么做。请原谅缩进,在 *** 的 WYSIWYG 上有点挣扎!

这是我的父组件设置:

class App extends React.Component 
    constructor(props) 
        super(props);
        this.state = 
            forecasts: [],
            location: 
                city: '',
                country: '',
            ,
            selectedDate: 0,
            searchText: '',
        ;
        this.handleForecastSelect = this.handleForecastSelect.bind(this);
        this.searchLocationChange = this.searchLocationChange.bind(this);
    

我想通过这个特定的功能来工作:

searchLocationChange() 
    console.log(this.state.searchText);
    Axios.get('https://mcr-codes-weather.herokuapp.com/forecast', 
            params: 
                city: this.state.searchText,
            ,
        )
        .then((response) => 
            this.setState(
                forecasts: response.data.forecasts,
                location: 
                    city: response.data.location.city,
                    country: response.data.location.country,
                
            );
        );

而在我的 Child 组件中,逻辑是:

class SearchForm extends React.Component 
    constructor(props) 
        super(props);
        this.state = 
            searchText: '',
        ;
        this.handleInputChange = this.handleInputChange.bind(this);
    

    handleInputChange(event) 
        const enteredText = event.target.value;
        this.setState(
            searchText: enteredText
        );
    

    render() 
        return (
            <span className="search-form">
              <div className="search-form__input"><input type="text" value=this.state.searchText onChange=this.handleInputChange /></div>
              <div className="search-form__submit"><button onClick=this.props.searchLocationChange>Search</button></div>
            </span>
        );
    

我意识到我正在尝试使用来自子组件状态的 searchText 更新父组件,但我无法弄清楚我需要更改哪些内容才能使其正常工作。我有一个偷偷摸摸的怀疑,我已经完成了 99% 的路,而且我只需要多几行,但我可能会走得很远?

【问题讨论】:

【参考方案1】:

你应该像this.props.searchLocationChange(this.state.searchText)那样调用函数

您可以执行以下操作

 <div className="search-form__submit"><button onClick=() => this.props.searchLocationChange(this.state.searchText)>Search</button></div>

函数定义应该是

searchLocationChange(searchText) 

【讨论】:

非常感谢 - 非常感谢!【参考方案2】:

您正在混合受控和不受控。要么受控,要么不受控。因此,仅从父级获取搜索文本。以上解决方案是这样做的一种方法。另一种方法是将 searchTxt 从父级传递给子级。

<SearchForm 
   searchTxt=this.state.searchTxt
   handleInputChange=this.handleInputChange
   searchLocationChange=this. searchLocationChange
/>

将您的 handleInputChange 移到父项中:

handleInputChange = (event) => 
    const enteredText = event.target.value;
    this.setState( searchText: enteredText );
  

然后将您的子组件相应的行更改为

 <div className="search-form__input"><input type="text" value=this.props.searchText onChange=this.props.handleInputChange /></div>

现在,当您尝试上面的代码时,它应该可以工作了。现在您将 searchTxt 保留在父组件中。您的 SearchForm 组件现在已完全受控。

【讨论】:

非常感谢您的帮助 - 非常感谢。【参考方案3】:

你已经从你的父母那里继承了searchLocationChange

在父组件中:

searchLocationChange(searchedText) 
console.log(searchText);
Axios.get('https://mcr-codes-weather.herokuapp.com/forecast', 
  params: 
    city: searchText,
  ,
)
  .then((response) => 
    this.setState(
      forecasts: response.data.forecasts,
      location: 
        city: response.data.location.city,
        country: response.data.location.country,
      ,
    );
  );

在孩子中:

render() 
 const  searchText  = this.state;
    return (
      <span className="search-form">
        <div className="search-form__input"><input type="text" value=this.state.searchText onChange=this.handleInputChange /></div>
        <div className="search-form__submit"><button onClick=()=>this.props.searchLocationChange(searchText)>Search</button></div>

      </span>
    );
  

【讨论】:

您正在调用 onclick searchLocation 中的函数。将其更改为 onClick=() => this.props.searchLocationChange(searchText) @simbathesailor 感谢您指出这一点。从字面上看,我错过了。

以上是关于将子组件的状态传递给父组件?的主要内容,如果未能解决你的问题,请参考以下文章

React:将子状态传递给父状态

在选择选项更改时将子组件中的道具传递给父组件

如何在反应中将最新状态从子组件传递给父组件

如何将组件的状态传递给父级?

如何在反应中将子组件的状态数组传递给父组件?

我如何在 reactjs + typescript (钩子)中使用 useRef 将子状态值传递给父级