React Context API - 孩子/消费者可以请求提供者更改值吗?

Posted

技术标签:

【中文标题】React Context API - 孩子/消费者可以请求提供者更改值吗?【英文标题】:React Context API - can children/consumers request that the provider change a value? 【发布时间】:2019-06-03 06:31:57 【问题描述】:

我之前使用过 Redux,这次很想实现 Context API。我非常想做React Context API - How to Get Reference To State Object In Provider For A Conditional Method 中描述的事情——但是,我希望“更改”功能更通用——它最初看起来像这样:

class ProviderComp extends Component
    state=
        name: "Gary",
        age: 20,
        color: "Red",
        changeMind: ()=>
            if(this.state.color === "Red")
                this.setState(
                    name: "Tony",
                    age: 35,
                    color: "Blue"
                )
            
            if(this.state.color === "Blue")
                this.setState(
                    name: "Gary",
                    age: 20,
                    color: "Red"
                )
            
        
    

但不是“changeMind()”,我想要 change(prop, val) 以便调用:

change("name","Bob")

将 state.name 更改为 Bob

change("age", 30)

将 state.age 更改为 30 等

这可能吗?我正在尝试做一些类似于 Redux 中的子级发送更改请求,而父级 reducer 接收请求并进行相应更新的事情。

我可能错误地考虑了上下文,因为我不只是提供上游然后消费下游,我试图让下游消费者将请求发送回提供者以改变事物 - 非常愿意接受教育更好的思考方式!

【问题讨论】:

我正在尝试让下游消费者向供应商发送回请求以更改内容 - 是的,它就是这样工作的。 谢谢,知道我并没有试图强迫系统以不同于其设计的方式工作 【参考方案1】:

为了改变提供者的价值,<Provider> 应该被重新渲染。所以这是关于制作一个托管提供程序的组件来存储和更新状态:

class ProviderComp extends Component 
  state = 
    change: (key, val) => this.setState( [key]: val ),
    ...
  ;

  render() 
    return <SomeContext.Provider value=this.state>...</SomeContext.Provider>
  

【讨论】:

【参考方案2】:

是的,只需将更改函数也传递给上下文值。 在包含上下文提供程序的组件中

changeMind = mind => this.setState(mind)

render() 
  <Context.Provider value=mind : this.state.mind, changeMind : this.changeMind>
  </Context.Provider>

然后在有consumer的组件中,调用context.changeMind会触发provider的值发生变化,例如

<Context.Consumer>

  contextValue => (<button onClick=contextValue.changeMind>Change</button>)

</Context.Consumer>

【讨论】:

谢谢,这是我链接的原始帖子,但我问的是如何概括“更改”功能,@estus 已在上面回答。

以上是关于React Context API - 孩子/消费者可以请求提供者更改值吗?的主要内容,如果未能解决你的问题,请参考以下文章

React Context API:消费者组件中未定义值

React API

React context API-我如何从 useEffect 钩子中分派一个动作?

React Context API似乎重新渲染每个组件

React Context 详细介绍(状态共享数据传递)

React中不常用的功能——Context