React - TypeError: jokes.map is not a function
React - TypeError: jokes.map is not a function
我对 React 比较陌生,我正在尝试构建一个简单的应用程序来查询 Chuck Norris API 和 returns 一个随机笑话。当我在浏览器中 运行 我的代码时,我收到以下错误消息:
TypeError: jokes.map is not a function
我的理论是 'map' 需要一个数组 - 我的 json 数据对象不是 - 但是我不确定并且不确定我的代码是什么/如何调整,即使是案例.
这是我的代码:
这是App.js:
import React, {Component} from 'react';
import Norris from './components/norris';
class App extends Component {
render() {
return (
<Norris jokes={this.state.jokes} />
)
}
state = {
jokes: []
};
componentDidMount() {
fetch('https://api.chucknorris.io/jokes/random')
.then(res => res.json())
.then((data) => {
this.setState({ jokes: data})
})
.catch(console.log)
}
}
export default App;
这里是norris.js:
import React from 'react'
const Norris = ({jokes}) => {
return (
<div>
<center><h1>Norris Jokes</h1></center>
{jokes.map((joke) => (
<div class="card">
<div class="card-body">
<h5 class="card-title">{joke.value}</h5>
</div>
</div>
))}
</div>
)
};
export default Norris
我检查了你 API 端点 https://api.chucknorris.io/jokes/random
它根本 return 任何数组,对象中也没有任何 data
变量 returns.
输出是一个具有某些属性的对象:
fetch('https://api.chucknorris.io/jokes/random')
.then(res => res.json())
.then((data) => {
console.log(data);
})
.catch(console.log)
https://api.chucknorris.io/jokes/random 的响应不是数组
如果你想把笑话作为一个数组,你可以像下面这样更改你的代码:
componentDidMount() {
fetch('https://api.chucknorris.io/jokes/random')
.then(res => res.json())
.then((data) => {
this.setState({ jokes: [data]})
})
.catch(console.log)
}
好吧,端点不提供数组,而是一个笑话,用 JSON 包裹起来,像这样:
{
categories: [ ],
created_at: "2020-01-05 13:42:20.841843",
icon_url: "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
id: "cFdQaTXXRJS_tIKa_xuqOg",
updated_at: "2020-01-05 13:42:20.841843",
url: "https://api.chucknorris.io/jokes/cFdQaTXXRJS_tIKa_xuqOg",
value: "Chuck Norris can ride a BMX bike while wearing bigass MC Hammer parachute pants."
}
(有点蹩脚,这个)。
因此,首先,将道具重命名为 joke
,而不是 jokes.map(//...
,其次,只保留
<div class="card">
<div class="card-body">
<h5 class="card-title">{joke.value}</h5>
</div>
</div>
您调用的 API 只是 ONE 个随机笑话,而不是笑话列表(对象数组)。
You can check this code sandbox with a working code.
Or here if you want a list with multiple jokes.
干杯!
App.js
import React, { useEffect, useState } from "react";
import Norris from "./Norris";
export default function App() {
const [state, setState] = useState([]);
useEffect(() => {
for (let i = 0; i < 5; i++) {
fetch("https://api.chucknorris.io/jokes/random")
.then((result) => result.json())
.then((data) => setState((s) => [...s, data.value]))
.catch((error) => console.log(error));
}
}, []);
return (
<div style={{ fontFamily: "sans-serif" }}>
<Norris jokes={state} />
</div>
);
}
Norris.js
import React from "react";
export default function Norris({ jokes }) {
return (
<>
<h1>Norris Jokes</h1>
<ul>
{jokes.map((joke, index) => (
<li key={index}>{joke}</li>
))}
</ul>
</>
);
}
我对 React 比较陌生,我正在尝试构建一个简单的应用程序来查询 Chuck Norris API 和 returns 一个随机笑话。当我在浏览器中 运行 我的代码时,我收到以下错误消息:
TypeError: jokes.map is not a function
我的理论是 'map' 需要一个数组 - 我的 json 数据对象不是 - 但是我不确定并且不确定我的代码是什么/如何调整,即使是案例.
这是我的代码:
这是App.js:
import React, {Component} from 'react';
import Norris from './components/norris';
class App extends Component {
render() {
return (
<Norris jokes={this.state.jokes} />
)
}
state = {
jokes: []
};
componentDidMount() {
fetch('https://api.chucknorris.io/jokes/random')
.then(res => res.json())
.then((data) => {
this.setState({ jokes: data})
})
.catch(console.log)
}
}
export default App;
这里是norris.js:
import React from 'react'
const Norris = ({jokes}) => {
return (
<div>
<center><h1>Norris Jokes</h1></center>
{jokes.map((joke) => (
<div class="card">
<div class="card-body">
<h5 class="card-title">{joke.value}</h5>
</div>
</div>
))}
</div>
)
};
export default Norris
我检查了你 API 端点 https://api.chucknorris.io/jokes/random
它根本 return 任何数组,对象中也没有任何 data
变量 returns.
输出是一个具有某些属性的对象:
fetch('https://api.chucknorris.io/jokes/random')
.then(res => res.json())
.then((data) => {
console.log(data);
})
.catch(console.log)
https://api.chucknorris.io/jokes/random 的响应不是数组
如果你想把笑话作为一个数组,你可以像下面这样更改你的代码:
componentDidMount() {
fetch('https://api.chucknorris.io/jokes/random')
.then(res => res.json())
.then((data) => {
this.setState({ jokes: [data]})
})
.catch(console.log)
}
好吧,端点不提供数组,而是一个笑话,用 JSON 包裹起来,像这样:
{
categories: [ ],
created_at: "2020-01-05 13:42:20.841843",
icon_url: "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
id: "cFdQaTXXRJS_tIKa_xuqOg",
updated_at: "2020-01-05 13:42:20.841843",
url: "https://api.chucknorris.io/jokes/cFdQaTXXRJS_tIKa_xuqOg",
value: "Chuck Norris can ride a BMX bike while wearing bigass MC Hammer parachute pants."
}
(有点蹩脚,这个)。
因此,首先,将道具重命名为 joke
,而不是 jokes.map(//...
,其次,只保留
<div class="card">
<div class="card-body">
<h5 class="card-title">{joke.value}</h5>
</div>
</div>
您调用的 API 只是 ONE 个随机笑话,而不是笑话列表(对象数组)。
You can check this code sandbox with a working code.
Or here if you want a list with multiple jokes.
干杯!
App.js
import React, { useEffect, useState } from "react";
import Norris from "./Norris";
export default function App() {
const [state, setState] = useState([]);
useEffect(() => {
for (let i = 0; i < 5; i++) {
fetch("https://api.chucknorris.io/jokes/random")
.then((result) => result.json())
.then((data) => setState((s) => [...s, data.value]))
.catch((error) => console.log(error));
}
}, []);
return (
<div style={{ fontFamily: "sans-serif" }}>
<Norris jokes={state} />
</div>
);
}
Norris.js
import React from "react";
export default function Norris({ jokes }) {
return (
<>
<h1>Norris Jokes</h1>
<ul>
{jokes.map((joke, index) => (
<li key={index}>{joke}</li>
))}
</ul>
</>
);
}