Javascript Reactjs不显示从状态生成的动态数据
我在reactjs组件上的javascript对象数组中循环时遇到了问题。chrome浏览器检查视图从console.log提供此输出--- 我将json文件存储在公用文件夹中,如下所示--- posts.json文件--- 1.json文件--- 这是我的数据获取函数---Javascript Reactjs不显示从状态生成的动态数据,javascript,json,reactjs,axios,public,Javascript,Json,Reactjs,Axios,Public,我在reactjs组件上的javascript对象数组中循环时遇到了问题。chrome浏览器检查视图从console.log提供此输出--- 我将json文件存储在公用文件夹中,如下所示--- posts.json文件--- 1.json文件--- 这是我的数据获取函数--- import React,{Fragment,Component}来自'React'; 从“axios”导入axios; 从'react router dom'导入{Link}; 进口{ 集装箱 }来自“反应带”; 类主页
import React,{Fragment,Component}来自'React';
从“axios”导入axios;
从'react router dom'导入{Link};
进口{
集装箱
}来自“反应带”;
类主页扩展组件{
state={posts:[]}
getPost(路径){
axios.get(路径)
.then(res=>(this.state.posts.push(res.data));
}
componentDidMount(){
get('./post data/posts.json')
.then(response=>response.data.map((value)=>(
this.getPost('./post data/'+value+'.json'))
)));
log(this.state.posts);
}
render(){
const listItems=this.state.posts.map((数据,键)=>
{key}
);
返回(
{this.state.posts?
{listItems}
:找不到帖子!}
)
}
}
导出默认主页;
但屏幕上什么也没显示。请帮帮我 您需要使用setState,否则不会调用重新渲染 将getPost方法更改为:
getPost(path) {
axios.get(path)
.then(res => this.setState({posts: this.state.posts.concat([res.data])}))
}
我认为您的问题在于渲染返回中缺少括号,请尝试:
返回(
{this.state.posts?(
{listItems}
):(找不到帖子!)}
)
基本上区别在于你的条件回报,每个部分都用括号condition?(返回1):(返回2)
另外,当您试图直接在
this.getPost()
中变异状态时,您可能会遇到问题。您应该使用this.setState()
来代替this.state.posts.push(something)
您应该使用this.setState()
来编写this.setState(prev=>({posts:[…prev.posts,something]))
this.state.posts.push(res.data)
关于状态的数据应该是不可变的,也就是说,你应该复制this.state.posts
并将其推到新数组上。此外,你应该使用setState
而不是直接更改this.state
。通过直接设置状态,React不会意识到状态的变化,因此不会改变现在重新渲染。这回答了你的问题吗?@benbotto brother,我如何在我的场景中设置state?你能详细说明一下吗!我认为这不太正确,因为这将res.data
中的单个post设置为posts
on state的数组。是的。设置state并没有存储每个json文件的所有数据。我已经更新了我的答案误解了api返回的内容
public
--post-data
----posts.json
----1.json
----2.json
----3.json
----4.json
----5.json
[1,2,3,4,5]
{
"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;
getPost(path) {
axios.get(path)
.then(res => this.setState({posts: this.state.posts.concat([res.data])}))
}
return (
<Fragment>
{this.state.posts ? (<section>
<Container>
<Row>
{listItems}
</Row>
</Container>
</section>) : (<p>No posts found!</p>)}
</Fragment>
)