javascript - 如何在基于类的组件中正确使用 React 上下文 API?
问题描述
我正在尝试创建一个订单页面。它类似于购物车。我想显示已在此页面上订购的商品。订单页面已单独创建。我有一个模态页面,我正在尝试将项目从模态页面获取到订单页面。
这是 Context API 的 JSX 代码
import React, {useState} from 'react';
export const CartContext = React.createContext();
export const CartProvider = (props)=>{
const [orders, setOrders] = useState([]);
return (
<CartContext.provider value={[orders, setOrders]}>
{props.children}
</CartContext.provider>
)
}
模态的 JSX 代码
class pizzaModal extends Component {
state = {
selected: "small",
showModal: true,
}
static contextType = CartContext
toggleHandler = (size)=> ()=>{
this.setState({
toggle: size
});
}
addToOrders = ()=>{
const [orders, setOrders] = this.contextType;
const pizza = {name: this.props.name, ingredients: this.props.ingredients, image: this.props.image, price: this.props.price}
setOrders(curr=> [...curr, pizza])
}
render (){
let attachedClasses = [styles.ImageContainer]
if(this.state.toggle==='small'){
attachedClasses = [styles.ImageContainer, styles.Small]
}
if(this.state.toggle==="medium"){
attachedClasses = [styles.ImageContainer, styles.Medium]
}
if(this.state.toggle==="large"){
attachedClasses=[styles.ImageContainer, styles.Large]
}
return (
<Aux>
<div className={styles.Pizzamodal}>
<div className={styles.ModalContainer}>
<div className={attachedClasses.join(' ')}>
<img src={this.props.image} alt="pizzapicture"/>
</div>
<div className={styles.DetailsContainer}>
<div>
<div className={styles.TextDetails}>
<h1>{this.props.name}</h1>
<p>{this.props.ingredients}</p>
</div>
<div>
<div className={styles.Form}>
<form className={styles.switchButton}>
<input type="radio" name="pizza" id="small" value="small" onChange={this.toggleHandler("small")}
checked={this.state.toggle==="small"}/>
<label for="small">Small</label>
<input type="radio" name="pizza" id="medium" value="medium" onChange={this.toggleHandler("medium")}
checked={this.state.toggle==="medium"}/>
<label for="medium">Medium</label>
<input type="radio" name="pizza" id="large" value="large" onChange={this.toggleHandler("large")}
checked={this.state.toggle==="large"}/>
<label for="large">Large</label>
</form>
</div>
<div className={styles.orderButton}>
<button onClick={this.addToOrders}>Add to basket for ₦{this.props.price}</button>
</div>
</div>
</div>
</div>
<div className={styles.Navbar} onClick={this.props.clicked}>
<div></div>
<div></div>
</div>
</div>
</div>
</Aux>
)
}
}
export default pizzaModal;
我尝试使用 JSX 代码的 Order 组件的 JSX 代码
<div className={Styles.OrderHeader}>
<div>
<img src={Logo} alt="logo"/>
<h1>DODO PIZZA</h1>
</div>
</div>
<h1 className={Styles.OrderContentContainerHeader}>My order</h1>
<div className={Styles.OrderContentContainer}>
<div className={Styles.OrderContent}>
<div>
<div style={{paddingRight: '80px'}}>
<img src={orders.image} alt="pizza"/>
</div>
<div>
<h1>{orders.name}</h1>
<p>{orders.ingredients}</p>
</div>
</div>
<div className={Styles.OrderContentPrice}>
<div><span>1</span></div>
<div><span>₦{orders.price}</span></div>
</div>
当我单击具有添加到订单功能的事件侦听器时,我收到 undefined is not iterable 的错误。如果我取出声明的变量,我会收到警告。如果我在渲染方法中声明它们,我不会收到警告,但我会在 setOrders 函数上获得未定义。
解决方案
推荐阅读
- firebase - Nuxt v2.14 Firebase Uncaught SyntaxError: Unexpected token '<'
- c# - 循环通过 App.Config 文件并将每个值存储在 C# 控制台应用程序的变量中?
- angular - Angular 10 - 无法加载模块脚本:服务器以“text/html”的非 JavaScript MIME 类型响应
- html - 表单标签默认行为
- python - PyCharm 错误(无法安装软件包)
- javascript - 如何在 React 应用程序中显示登录的用户名
- spring-boot - Spring Cloud Stream 自定义聚合器处理器 - 性能问题
- mdriven - 当服务器端或异步时,如何在 ocl 中执行“while 循环”?
- reactjs - 使用 MobX 在 const 函数中反应 useEffect
- javascript - 如何从 URL 输入动态更改文本?