我正在构建一个猜谜游戏,其中问题和选择逻辑位于名为 Questions 的组件中。我在让 App 读取问题代码时遇到问题。我希望 App 中的状态根据子组件中的选择进行更新。
我一直在尝试对如何在 ReactJS 中将数据从子组件传递到其父组件中的解决方案进行逆向工程?和https://malithjayaweera.com/2018/01/reactjs-passing-data-react-components/,但我不清楚如何将它应用于我的项目。
应用程序:
import React, { Component } from 'react';
import './App.css';
import Timer from "./Timer";
import Questions from "./Questions/Questions.js";
import Results from "../src/Results";
class App extends Component {
state = {
totalTrue: 0,
totalFalse: 0,
}
componentDidMount() {
console.log(`TotalTrue: ${this.state.totalTrue}`);
console.log(`TotalFalse: ${this.state.totalFalse}`);
}
// submit button
handleFormSubmit = event => {
event.preventDefault();
console.log("submit button clicked");
};
callbackHandlerFunction = (selectedOption) => {
this.setState({ selectedOption });
}
render() {
return (
<div className="parallax">
<div className="App">
<div className="wrapper">
<div className="headerDiv">
<h1>Pixar Trivia!</h1>
</div>
<div className="timerDiv">
<Timer />
</div>
<div className="questionSection">
<Questions
handleClickInParent={this.callbackHandlerFunction}
/>
</div>
<div>
<button onClick={this.handleFormSubmit}>Submit</button>
</div>
{/* this.state.articles.length > 0 && ...*/}
<div className="resultsDiv">
<Results
totalTrue={this.state.totalTrue}
totalFalse={this.state.totalFalse}
/>
</div>
</div>
</div>
</div>
);
}
}
export default App;
问题:
import React, { Component } from "react";
import Select from "react-select";
import "./Questions.css";
const answerChoices = [
{
id: 1,
text: "1. The background image is the carpet from Sid's house in Toy Story. What movie inspired it?",
answers: [
{
label: "2001: A Space Odyssey",
value: false
},
{
label: "The Shining",
value: true
},
{
label: "One Flew Over the Cuckoo's Nest",
value: false
},
{
label: "The Godfather",
value: false
}
]
},
---- full questions cut for space. I'm using https://github.com/JedWatson/react-select and the functionality works. ----
{
id: 8,
text: "8. Who was the original voice of Marlin from “Finding Nemo”?",
answers: [
{
label: "Albert Brooks",
value: false
},
{
label: "Denis Leary",
value: false
},
{
label: "Brad Garrett",
value: false
},
{
label: "William H. Macy",
value: true
}
]
}
];
class Questions extends Component {
state = {
answerChoices,
selectedOption: null,
}
handleChange = (selectedOption) => {
this.setState({ selectedOption });
console.log(`Option selected:`, selectedOption);
const answerValue = selectedOption.value;
if (answerValue === true) {
// console.log(answerValue);
this.setState({totalTrue: this.totalTrue + 1}, () => {
console.log(`New TotalTrue: ${this.totalTrue}`);
});
};
if (answerValue === false) {
// console.log(answerValue);
this.setState({totalFalse: this.totalFalse + 1}, () => {
console.log(`New TotalFalse: ${this.totalFalse}`);
});
};
this.props.handleClickInParent({selectedOption});
}
render() {
// const { selectedOption } = this.state;
return (
<div className="questionsDiv">
<ol>
{this.state.answerChoices.map(question => {
return (
<div className="individualQuestions" key={question.id}>
{question.text}
<Select
value={this.selectedOption}
onChange={this.handleChange}
options={question.answers}
/>
</div>
)
})}
</ol>
</div>
)
}
}
export default Questions;