reactjs - 如何进行反应钩子API调用并仅显示一项
问题描述
我正在尝试创建一个带有反应钩子的随机报价机,我可以编写一个它们的列表以显示,但我很困惑如何向 useEffect 函数添加步骤以只显示一个随机的。
我可以通过映射它们来列出每个报价,但我不知道 useEffect 在哪里让它只选择一个报价并显示它。我知道如何为类组件编写代码,但我将如何更新它以反映反应钩子。
class RandomQuote extends Component {
constructor(props) {
super(props)
this.state = {
quote: '',
author: ''
}
}
componentDidMount() {
this.getQuote()
}
getQuote() {
let url =
'https://gist.githubusercontent.com/camperbot/5a022b72e96c4c9585c32bf6a75f62d9/raw/e3c6895ce42069f0ee7e991229064f167fe8ccdc/quotes.json'
axios.get(url)
.then(res => {
let data = res.data.quotes
let quoteNum = Math.floor(Math.random() * data.length)
let randomQuote = data[quoteNum]
this.setState({
quote: randomQuote['quote'],
author: randomQuote['author']
})
})
}
getNewQuote = () => { //will be called on clicking the New Quote button
this.getQuote()
}
const [data, setData] = useState({ quotes: [
{quote: '', author: ''}
] });
useEffect(() => {
const fetchData = async () => {
const result = await axios(
'https://gist.githubusercontent.com/camperbot/5a022b72e96c4c9585c32bf6a75f62d9/raw/e3c6895ce42069f0ee7e991229064f167fe8ccdc/quotes.json',
);
setData(result.data);
};
fetchData();
}, []);
我只需要帮助将旧的 React “翻译”为新的钩子。
解决方案
这是对 React Hooks 的完整“翻译”:
import { useCallback, useEffect, useState } from "react";
const RandomQuote = props => {
const [quote, setQuote] = useState("");
const [author, setAuthor] = useState("");
function getQuote() {
const url =
"https://gist.githubusercontent.com/camperbot/5a022b72e96c4c9585c32bf6a75f62d9/raw/e3c6895ce42069f0ee7e991229064f167fe8ccdc/quotes.json";
axios.get(url).then(res => {
const data = res.data.quotes;
const quoteNum = Math.floor(Math.random() * data.length);
const randomQuote = data[quoteNum];
setQuote(randomQuote.quote);
setAuthor(randomQuote.author);
});
}
useEffect(() => {
getQuote();
}, []);
const onButtonClick = useCallback(event => {
getQuote();
}, []);
return <button onClick={onButtonClick} />;
};
推荐阅读
- javascript - 在跨域ajax帖子的回调函数中未定义
- c# - 如何将 DataGrid 绑定到设计结构矩阵 (DSM)
- amazon-web-services - AWS IoT DynamoDB 创建规则
- r - r - 创建后代的可能结果基因型
- powershell - 使用 RSJobs 运行多个不同的 ScriptBlock
- android - 无法获取三星 Galaxy Note 10.1 (N8010) 帧缓冲区,fb0 仅显示顶栏
- c - 在 C 中创建一个 atoi 函数
- swift - 使用 xmppFramework 连接到服务器时卡住
- android - Zygote: isWhitelistProcess - 进程被列入白名单
- java - 为什么字母数字 id 搜索在 Java Swing 中无法正常工作?