Reactjs 不显示从状态生成的动态数据
Reactjs not showing the dynamic data generated from state
我在遍历 reactjs 组件上的 javascript 对象数组时遇到问题。 chrome 浏览器检查视图给出来自 console.log ---
的输出
0: {id: 1, title: "This is a post 1"}
1: {id: 2, title: "This is a post 2"}
2: {id: 3, title: "This is a post 3"}
3: {id: 4, title: "This is a post 4"}
4: {id: 5, title: "This is a post 5"}
length: 5
__proto__: Array(0)
我已将 json 文件存储在 public 文件夹中,如下所示 ---
public
--post-data
----posts.json
----1.json
----2.json
----3.json
----4.json
----5.json
posts.json 文件 ---
[1,2,3,4,5]
1.json 文件 ---
{
"id": 1,
"title": "This is a post 1"
}
这是我的数据获取函数---
import React, { Fragment, Component } from 'react';
import axios from 'axios';
import { Link } from 'react-router-dom';
import {
Container, Row, Col, Jumbotron
} from 'reactstrap';
class HomePage extends Component {
state = { posts: [] }
getPost(path) {
axios.get(path)
.then(res => (this.state.posts.push(res.data)));
}
componentDidMount() {
axios.get('./post-data/posts.json')
.then(response => response.data.map((value) => (
this.getPost('./post-data/' + value + '.json')
)));
console.log(this.state.posts);
}
render() {
const listItems = this.state.posts.map((data, key) =>
<Col lg={{ size: 4 }} className="mb-3">{key}</Col>
);
return (
<Fragment>
{this.state.posts ? <section>
<Container>
<Row>
{listItems}
</Row>
</Container>
</section> : <p>No posts found!</p>}
</Fragment>
)
}
}
export default HomePage;
但是屏幕上没有显示任何内容。请帮助我!
您需要使用 setState,否则 re-render 不会被调用。
将您的 getPost 方法更改为:
getPost(path) {
axios.get(path)
.then(res => this.setState({posts: this.state.posts.concat([res.data])}))
}
我认为你的问题是你在 render return 中缺少括号,试试:
return (
<Fragment>
{this.state.posts ? (<section>
<Container>
<Row>
{listItems}
</Row>
</Container>
</section>) : (<p>No posts found!</p>)}
</Fragment>
)
基本上区别在于你的条件 return,每个部分都用括号标记 condition ? (return 1) : (return 2)
此外,您可能会遇到问题,因为您正试图直接在 this.getPost()
中改变状态,您应该使用 this.setState()
而不是 this.state.posts.push(something)
,这样您就可以编写 this.setState(prev => ({posts: [...prev.posts, something]}))
.
我在遍历 reactjs 组件上的 javascript 对象数组时遇到问题。 chrome 浏览器检查视图给出来自 console.log ---
的输出0: {id: 1, title: "This is a post 1"}
1: {id: 2, title: "This is a post 2"}
2: {id: 3, title: "This is a post 3"}
3: {id: 4, title: "This is a post 4"}
4: {id: 5, title: "This is a post 5"}
length: 5
__proto__: Array(0)
我已将 json 文件存储在 public 文件夹中,如下所示 ---
public
--post-data
----posts.json
----1.json
----2.json
----3.json
----4.json
----5.json
posts.json 文件 ---
[1,2,3,4,5]
1.json 文件 ---
{
"id": 1,
"title": "This is a post 1"
}
这是我的数据获取函数---
import React, { Fragment, Component } from 'react';
import axios from 'axios';
import { Link } from 'react-router-dom';
import {
Container, Row, Col, Jumbotron
} from 'reactstrap';
class HomePage extends Component {
state = { posts: [] }
getPost(path) {
axios.get(path)
.then(res => (this.state.posts.push(res.data)));
}
componentDidMount() {
axios.get('./post-data/posts.json')
.then(response => response.data.map((value) => (
this.getPost('./post-data/' + value + '.json')
)));
console.log(this.state.posts);
}
render() {
const listItems = this.state.posts.map((data, key) =>
<Col lg={{ size: 4 }} className="mb-3">{key}</Col>
);
return (
<Fragment>
{this.state.posts ? <section>
<Container>
<Row>
{listItems}
</Row>
</Container>
</section> : <p>No posts found!</p>}
</Fragment>
)
}
}
export default HomePage;
但是屏幕上没有显示任何内容。请帮助我!
您需要使用 setState,否则 re-render 不会被调用。
将您的 getPost 方法更改为:
getPost(path) {
axios.get(path)
.then(res => this.setState({posts: this.state.posts.concat([res.data])}))
}
我认为你的问题是你在 render return 中缺少括号,试试:
return (
<Fragment>
{this.state.posts ? (<section>
<Container>
<Row>
{listItems}
</Row>
</Container>
</section>) : (<p>No posts found!</p>)}
</Fragment>
)
基本上区别在于你的条件 return,每个部分都用括号标记 condition ? (return 1) : (return 2)
此外,您可能会遇到问题,因为您正试图直接在 this.getPost()
中改变状态,您应该使用 this.setState()
而不是 this.state.posts.push(something)
,这样您就可以编写 this.setState(prev => ({posts: [...prev.posts, something]}))
.