javascript - 如何在 React 中动态传递组件?
问题描述
我正在构建一个石头/纸/剪刀 React 应用程序,但是当我尝试做出选择(石头、剪刀或纸)时遇到问题,保存该选择的值并将其显示在屏幕上。我已经设法 console.log 用户选择的选项的所有值,但我不知道如何将它们传递回我的选择组件,并实际在屏幕上看到它。
你能帮我解决这个问题吗?
非常感谢!
主.js
import React from "react"
import Choice from "./Choice"
import paper from '../images/icon-paper.svg'
import rock from '../images/icon-rock.svg'
import scissors from '../images/icon-scissors.svg'
import './Main.css';
class Main extends React.Component {
constructor(props) {
super(props)
this.state = {
onScreen: true,
}
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
this.setState({
onScreen: false
})
}
render() {
return(
<div>
{/*HOME PAGE*/}
<div className="main-container" style={{display: (this.state.onScreen ? "block" : "none")}}>
<div className="triangle-container">
<div onClick={this.handleClick}>
<Choice
name="paper"
image={paper}
borderColor="hsl(230, 89%, 62%)"
extraBorderColor="hsl(230, 89%, 65%)"
/>
</div>
<div onClick={this.handleClick}>
<Choice
name="scissors"
image={scissors}
borderColor="hsl(39, 89%, 49%)"
extraBorderColor="hsl(40, 84%, 53%)"
/>
</div>
<div style={{gridArea: "bottom"}} onClick={this.handleClick}>
<Choice
name="rock"
image={rock}
borderColor="hsl(349, 71%, 52%)"
extraBorderColor="hsl(349, 70%, 56%)"
/>
</div>
</div>
</div>
{/*RESULT PAGE*/}
<div className="rsult-container" style={{display: (!this.state.onScreen ? "block" : "none")}}>
<Choice />
</div>
</div>
)
}
}
export default Main
选择.js
import React from "react"
import './Choice.css';
class Choice extends React.Component {
constructor(props) {
super(props)
this.state = {
name: props.name,
image: props.image,
borderColor: props.borderColor,
extraBorderColor: props.extraBorderColor
}
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
console.log(this.state.name)
console.log(this.state.image)
console.log(this.state.borderColor)
console.log(this.state.extraBorderColor)
}
render() {
return(
<div className="elem-box">
<div
style={{borderColor: this.state.borderColor, color: this.state.extraBorderColor}}
className="elem-container"
onClick={this.handleClick}
>
<img src={this.props.image} className="choice-image" alt="img" />
</div>
</div>
)
}
}
export default Choice
解决方案
在组件的状态中添加一个新属性Main
(我们称之为choiceName
)。
this.state = {
onScreen: true,
choiceName: '',
}
Main
将您的组件更新handleClick
为 curry 函数:
handleClick = (choiceName) => () => {
this.setState({
onScreen: false,
choiceName,
});
}
然后作为道具发送handleClick
到组件:Choice
<Choice
name="paper"
image={paper}
borderColor="hsl(230, 89%, 62%)"
extraBorderColor="hsl(230, 89%, 65%)"
handleClick={this.handleClick}
/>
Choice
通过删除其handleClick
定义并将方法更改为以下来更新您的组件render
:
render() {
return (
<div className="elem-box">
<div
style={{ borderColor: this.state.borderColor, color: this.state.extraBorderColor }}
className="elem-container"
onClick={this.handleClick(this.state.name)}
>
<img src={this.props.image} className="choice-image" alt="img" />
</div>
</div>
)
}
最后使用该this.state.choiceName
值在屏幕上显示。
推荐阅读
- javascript - 无法将自定义 Select 值传播到其父组件状态
- hyperledger-fabric - 如何在 Hyperledger Fabric 链码中获取交易提交者
- python - 我无法获得给定代码的结果
- java - 用 Java 解码 JSON 文件
- r - 迭代地将数据集与结果数据集连接起来
- javascript - HTML5 Canvas 图像函数触发但有时图像未绘制
- python - 查找数组的非连续所有格元素的最大和的逻辑实现
- c - 如何找出冻结的张量流图的正确输入和输出操作?
- sql-server - 插入临时表和表变量时的不同结果
- meteor - 是否可以使用 MUP 从多台计算机部署/管理相同的应用程序