我试图在我的项目中使用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子中重新呈现。
代码中的所有内容都会签出,只有一个除外。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