当前位置: 首页 > 知识库问答 >
问题:

当提供程序组件父级状态更改时,为什么不能更新子级组件中的值(具有react上下文)?

桓宜
2023-03-14

我试图在我的项目中使用React上下文。我实现了一个提供程序组件,并在两个子组件中使用数据。但是,当我从其中一个子组件更新提供程序组件的状态时,不会用来自提供程序组件的数据重新呈现另一个子组件。

我使用React上下文的这些特性来避免将道具从组件传递到组件。就像我过去实施的那样

Codesandbox示例

const {Provider, Consumer} = React.createContext()

class ShoppingCartProvider extends React.Component{
 constructor(props){
            super(props)
            this.state = {
                  order: {},
                  Total: 0,

            }
      }

      addOrder = (key) => {
            const order = this.state.order
            let totalOrder = this.state.Total
            order[key] = order[key] + 1 || 1
            this.setState({order})
            totalOrder = totalOrder + 1
            this.setState({Total: totalOrder})

      }
      render(){
            return(
                  <Provider value={{
                        order: this.state.order,
                        addOrder: this.addOrder,
                        totalOrder: this.state.Total
                  }}>
                  <div>{this.props.children}</div>
                  </Provider>     
            )
      }
}

export {ShoppingCartProvider, Consumer as ShoppingCartConsumer}
import React, {useContext } from 'react';

const ItemProducto = props =>{
      const {product} = props

      const {addOrder} = useContext(ShoppingCartConsumer)

      return <Grid item>
                 <div css={botonAdd}
                   onClick={()=>{
                        addOrder(product._id)
                  }}>Add</div>
             </Grid>

}



export default ItemProducto

//父组件中的状态更改时,不会重新呈现



import React, {useContext, useEffect, useState} from 'react';

const Header = props =>{      

      const {totalOrder} = useContext(ShoppingCartConsumer)
      const [count, setcount] = useState(totalOrder)

      useEffect(()=>{
            setcount(totalOrder)
      })
      return (
           <div>                                                                
              <Grid item  css={numeroDinero}>{count}</Grid>                                                              
           </div> 

      )
}


export default Header

当ItemProducto子更改Total state属性时,我希望在Header子中重新呈现。

共有1个答案

吴兴国
2023-03-14

代码中的所有内容都会签出,只有一个除外。usecontext()期望实际上下文作为参数,而不是使用者。在您的示例中,您通过以下操作传入了消费者:export{...,consumer as ShoppingCartConsumer}

解决此问题所需做的就是:在ShoppingCartContext更改中:

const{Provider,Consumer}=react.createContext()

render() {
    return (
      <ShoppingCartContext.Provider
        value={{
          order: this.state.order,
          addOrder: this.addOrder,
          totalOrder: this.state.Total
        }}
      >
        <div>{this.props.children}</div>
      </ShoppingCartContext.Provider>
    );
  }

然后将导出更改为:export{ShoppingCartProvider,ShoppingCartContext};

相应地修改ItemProducto中的导入,并且不要忘记将ShoppingCartContext传递给它们各自的usecontext()

有关usecontext的更多信息,请参见此处

 类似资料:
  • 我正在尝试制作一个很好的ApiWrapper组件来填充各种子组件中的数据。从我读到的所有内容来看,这应该是可行的:https://jsfidle.net/vinniejames/m1mesp6z/1/ 但由于某种原因,当父状态更改时,子组件似乎没有更新。 我是不是漏了什么?

  • 我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?

  • 问题内容: 我正在尝试制作一个不错的ApiWrapper组件,以填充各种子组件中的数据。从我阅读的所有内容来看,这应该可以正常工作:https : //jsfiddle.net/vinniejames/m1mesp6z/1/ 但是由于某种原因,当父状态更改时,子组件似乎没有更新。 我在这里想念什么吗? 问题答案: 您的代码有两个问题。 您的子组件的初始状态是通过props设置的。 引用此SO答案:

  • 为什么在下面的伪代码示例中,当容器更改foo.bar时,Child没有重新呈现? 即使我在修改容器中的值后调用,Child仍然显示旧值。

  • 这个问题在这里已经得到了回答,但事情总是在变化。 基本上,父组件获取一些数据,子组件需要这些数据。 这是子组件。

  • 我创建了一个包含登录组件和注册组件的签名页面组件。我的问题是,我如何传递一个onhtml函数从父到子,以便更改我的父组件(签名页组件)的状态?我期望的是,通过单击子组件中的按钮,可以切换父组件的活动状态,并根据活动状态更改样式。我试图通过一个处理功能从父到子,但它不能很好地工作。 有什么解决办法吗? codesandbox中的详细信息:https://codesandbox.io/s/wizard