reactjs - 根据当前的 SELECT OPTION VALUE 设置标题 onSubmit - 反应
问题描述
我在 youtube 上找到了有关如何在 youtube 上创建反应测验应用程序的教程链接到教程
我正在尝试在提交表单时根据当前的 Select Option Value 设置标题。目前,我仅在选择不同选项时才设法更改标题。
import React, { useState, useEffect, useRef } from "react";
import "./App.css";
import axios from "axios";
import FlashcardList from "./components/FlashcardList";
function App() {
const [flashcards, setFlashcards] = useState([]);
const [categories, setCategories] = useState([]);
const [title, setTitle] = useState("General Knowledge");
const categoryEl = useRef();
const amountEl = useRef();
useEffect(() => {
axios.get("https://opentdb.com/api_category.php").then((res) => {
setCategories(res.data.trivia_categories);
});
}, []);
function decodeString(str) {
const textArea = document.createElement("textarea");
textArea.innerHTML = str;
return textArea.value;
}
function handleSubmit(e) {
e.preventDefault();
axios
.get("https://opentdb.com/api.php", {
params: {
amount: amountEl.current.value,
category: categoryEl.current.value,
},
})
.then((res) => {
setFlashcards(
res.data.results.map((questionItem, index) => {
const answer = decodeString(questionItem.correct_answer);
const options = [...questionItem.incorrect_answers, answer];
return {
id: `${index} - ${Date.now()}`,
question: decodeString(questionItem.question),
answer: answer,
options: options.sort(() => Math.random() - 0.5),
};
})
);
});
}
function getTitle(e) {
setTitle(e.target.options[e.target.selectedIndex].text);
}
return (
<>
<form className="header" onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="category">Category</label>
<select id="category" ref={categoryEl} onChange={getTitle}>
{categories.map((category) => {
return (
<option value={category.id} key={category.id}>
{category.name}
</option>
);
})}
</select>
</div>
<div className="form-group">
<label htmlFor="amount">Number Of Questions</label>
<input
type="number"
id="amount"
min="1"
step="1"
defaultValue={10}
ref={amountEl}
/>
</div>
<div className="form-group">
<button className="btn">Generate</button>
</div>
</form>
<div className="container">
<h1 className="title">{title}</h1>
<FlashcardList flashcards={flashcards} />
</div>
</>
);
}
export default App;
解决方案
您可以在获取类别后立即设置类别。可以只使用第零个元素来设置标题。
useEffect(() => { axios.get("https://opentdb.com/api_category.php").then((res) => {
setCategories(res.data.trivia_categories);
setTitle(res.data.trivia_categories[0]);
});
}, []);
推荐阅读
- build.gradle - Android Studio 4.0.1:构建失败:不推荐使用选项“android.databinding.enableV2”
- reactjs - 如何使用 cypress-react-unit-test 测试受控的 React 组件
- r - 使用 ggplot2 在 R 中绘制 PCA 的问题
- rust - Rust 中是否有一个特性允许按组折叠而没有协程等实验性功能?
- ios - -[EdgeAnalyticPageView_Cell_Selector didSelectItem:dataSource:]:无法识别的选择器发送到实例 0x7fc6f314fef0
- python-3.x - 从另一个 api 函数调用内部 api
- javascript - 使用 jQuery 在 GET 请求中发送正文
- python - 如何从 Quizlet 获取数据而不会因网络抓取而被阻止?
- c# - 如何处理并发用户对 Blazor webassembly 中的数据进行更改
- javascript - @click 上的 Vuetify 选项卡未更改