React/NextJS 状态问题
React/NextJS state issues
我在 NextJS/React 中有一个简单的脚本,我正在努力保存状态并在变量中重用数据。
import React from 'react';
import Head from 'next/head'
import Image from 'next/image'
import axios from 'axios';
import styles from '../styles/Home.module.css'
export default function Home() {
const [ETHdata, setETHData] = React.useState({ });
const [CryptoDATA, setCryptoDATA] = React.useState({ });
一切都很好:)
现在我正在从 API:
中获取数据
const fetchETH = async () => {
const res = await axios.get('https://api.coingecko.com/api/v3/simple/price?ids=Ethereum&vs_currencies=CHF&include_24hr_change=true');
if (res.data && res.data.ethereum) {
setETHData(res.data.ethereum);
}
}
但是由于为 10 种加密货币重写相同的东西可能很累,所以我在这里一次获取它们:
const fetchCryptoDATA= async () => {
const res = await axios.get('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum%2Ccrypto-com-chain%2Csolana%2Cavalanche-2%2Cblockstack%2Cflow%2Clitecoin%2Calgorand%2Ccardano&vs_currencies=CHF&include_24hr_change=true');
if (res.data ) {
setCryptoDATA(res.data);
}
console.log (CryptoDATA)
}
但是当我显示它们时:
React.useEffect(() => {
fetchETH();
fetchCryptoDATA();
}, []);
return (
...
这个很好用
<p>Ethereum {ETHdata['chf']} {parseFloat(ETHdata['chf_24h_change']).toFixed(2)}</p>
但是
<p>ETHEREUM {CryptoDATA['ethereum']['chf']} {parseFloat(CryptoDATA['ethereum']['chf_24h_change']).toFixed(2)}</p>
我第一次加载它时会工作,但随后 return
“无法读取未定义的 属性 'chf'”
我确定这是微不足道的事情,非常感谢您的帮助!
CryptoDATA['ethereum']
可能是 undefined
。因为CryptoDATA
的初始状态是一个空对象:
const [CryptoDATA, setCryptoDATA] = React.useState({ });
一种选择是将该初始状态设置为您期望的结构:
const [CryptoDATA, setCryptoDATA] = React.useState({ ethereum: { } });
另一种选择是在引用 potentially-undefined 对象的属性时使用 optional chaining:
CryptoDATA.ethereum?.chf
或者您可以检查 属性 是否明确存在:
CryptoDATA['ethereum'] ? CryptoDATA['ethereum']['chf'] : null
您甚至可以完全采用不同的方法并在 AJAX 操作期间跟踪布尔“加载”状态,并且在数据加载时根本不呈现这部分标记,而是将其替换为某种微调器或加载指示器。
无论您采用何种方式,底线都是一样的。您不能在 undefined
对象上引用 属性。由于 AJAX 操作在 第一次渲染后 完成,最初您要查找的对象当前是 undefined
.
替换您的代码中的这一行。
ETHEREUM {CryptoDATA['ethereum']?.['chf']} {parseFloat(CryptoDATA['ethereum']?.['chf_24h_change'])?.toFixed( 2)}
我在 NextJS/React 中有一个简单的脚本,我正在努力保存状态并在变量中重用数据。
import React from 'react';
import Head from 'next/head'
import Image from 'next/image'
import axios from 'axios';
import styles from '../styles/Home.module.css'
export default function Home() {
const [ETHdata, setETHData] = React.useState({ });
const [CryptoDATA, setCryptoDATA] = React.useState({ });
一切都很好:)
现在我正在从 API:
中获取数据 const fetchETH = async () => {
const res = await axios.get('https://api.coingecko.com/api/v3/simple/price?ids=Ethereum&vs_currencies=CHF&include_24hr_change=true');
if (res.data && res.data.ethereum) {
setETHData(res.data.ethereum);
}
}
但是由于为 10 种加密货币重写相同的东西可能很累,所以我在这里一次获取它们:
const fetchCryptoDATA= async () => {
const res = await axios.get('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum%2Ccrypto-com-chain%2Csolana%2Cavalanche-2%2Cblockstack%2Cflow%2Clitecoin%2Calgorand%2Ccardano&vs_currencies=CHF&include_24hr_change=true');
if (res.data ) {
setCryptoDATA(res.data);
}
console.log (CryptoDATA)
}
但是当我显示它们时:
React.useEffect(() => {
fetchETH();
fetchCryptoDATA();
}, []);
return (
...
这个很好用
<p>Ethereum {ETHdata['chf']} {parseFloat(ETHdata['chf_24h_change']).toFixed(2)}</p>
但是
<p>ETHEREUM {CryptoDATA['ethereum']['chf']} {parseFloat(CryptoDATA['ethereum']['chf_24h_change']).toFixed(2)}</p>
我第一次加载它时会工作,但随后 return
“无法读取未定义的 属性 'chf'”
我确定这是微不足道的事情,非常感谢您的帮助!
CryptoDATA['ethereum']
可能是 undefined
。因为CryptoDATA
的初始状态是一个空对象:
const [CryptoDATA, setCryptoDATA] = React.useState({ });
一种选择是将该初始状态设置为您期望的结构:
const [CryptoDATA, setCryptoDATA] = React.useState({ ethereum: { } });
另一种选择是在引用 potentially-undefined 对象的属性时使用 optional chaining:
CryptoDATA.ethereum?.chf
或者您可以检查 属性 是否明确存在:
CryptoDATA['ethereum'] ? CryptoDATA['ethereum']['chf'] : null
您甚至可以完全采用不同的方法并在 AJAX 操作期间跟踪布尔“加载”状态,并且在数据加载时根本不呈现这部分标记,而是将其替换为某种微调器或加载指示器。
无论您采用何种方式,底线都是一样的。您不能在 undefined
对象上引用 属性。由于 AJAX 操作在 第一次渲染后 完成,最初您要查找的对象当前是 undefined
.
替换您的代码中的这一行。
ETHEREUM {CryptoDATA['ethereum']?.['chf']} {parseFloat(CryptoDATA['ethereum']?.['chf_24h_change'])?.toFixed( 2)}