通过反应上下文 api 将子状态传递给父组件

Posted

技术标签:

【中文标题】通过反应上下文 api 将子状态传递给父组件【英文标题】:pass a childs state through react context api to parent component 【发布时间】:2019-01-07 18:22:23 【问题描述】:

我正在尝试将子组件的状态传递给App.js 文件。 为此,我想使用新的上下文 API。

但是我读过这不起作用,因为如果值动态变化,提供者必须是消费者的父级。

在我的情况下,我不需要动态更改它,我只想将状态传递给消费者。子组件的状态不会改变,所以以后不改变也没问题。

这是否可以将状态从BlogPost.js 传递到App.js?如果有使用上下文 API 的替代方法,也可以。

我的代码:

App.js:

import BlogPost from './containers/BlogPost/BlogPost';

import  MediaContext  from './containers/BlogPost/BlogPost.js'

class App extends Component 

  render() 


      return (
          <div>
              <BlogPost />
              <MediaContext.Consumer>
                value => 
              console.log(value)
          </MediaContext.Consumer>
      </div>
    );
  


export default App

BlogPost.js: 该组件的状态应该被传递。如果我在React.createContext('hello') 中定义上下文,它就可以工作。但我不能在那里定义状态。

export const MediaContext = React.createContext();

class BlogPost extends Component 
    state = 
        title: "title",
        image: 
            src: "link",
            alt: "alt,
            credits: "Unsplash",
        ,
        text: "Text Text Text",
        media: 
            type: 'music',
            audiosrc: 'audiosrc',
            coversrc: 'coversrc',
            artist: 'artist',
            title: 'Songtitle',
            started: false
        ,
    

    render() 
        return (
            <article>
                <MediaContext.Provider value=this.state>
                </MediaContext.Provider>
            </article>
        );
    



export default BlogPost;

【问题讨论】:

您可以使用自定义道具将数据传递给父组件。例如,在 App.js 中调用 &lt;BlogPost onPropChange=functionInParent()/&gt; 之类的组件,然后从 BlogPost 中调用 this.props.onPropChange(data_to_be_passed)。我不明白您的 BlogPost 组件在 App.js 中的位置。如果你能澄清一下,我可以给你一个明确的解决方案。 对不起,我删除了太多... BlogPost 组件(目前)直接在 App.js 中使用。在我的问题中的 App.js 下也添加了 BlogPost。 【参考方案1】:

React 上下文 API 旨在将数据从父级传递给子级。因此,您将不得不使用自定义道具。在您的 App.js 中,使用 prop 调用 BlogPost 并调用它将触发 handleData 函数。

import BlogPost from './containers/BlogPost/BlogPost';

class App extends Component 

handleData = (value) => 
  console.log(value)
 

render() 


  return (
      <div>
          <BlogPost customProp=this.handleData/>
    </div>
   );
  
 
export default App

然后在你的 blogpost.js 中,只要你想传递数据,就调用 customProp 函数。如果您想在组件挂载后立即传递数据,请在 componentDidMount 生命周期或任何其他生命周期方法中调用它,具体取决于您想要传递数据的时间。

class BlogPost extends Component 
 constructor(props) 
 super(props);
 this.state = 
    title: "title",
    image: 
        src: "link",
        alt: "alt,
        credits: "Unsplash"
            ,
    text: "Text Text Text",
    media: 
       type: 'music',
       audiosrc: 'audiosrc',
       coversrc: 'coversrc',
       artist: 'artist',
       title: 'Songtitle',
       started: false
           
   
  

componentDidMount()
this.props.customProp(this.state);


render() 
    return (
        <article/>
    );




 export default BlogPost;

【讨论】:

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

使用图像的 SRC 将子级传递给父级时出现问题。反应 JS

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

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

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

在Django中将上下文从子模板传递给父模板

使用 Context API 在函数组件中反应未定义的状态属性