无法获取先前声明的数组元素以在 ReactJS 渲染中使用它
Can't get array elements previously declared to use it in render with ReactJS
我之前从 API 中获取了一个数组。我将它保存到变量 "ids" 中。问题是 "ids" 变量在渲染中为空。如何查看我保存在 "ids" 变量中的先前声明的值?
这是我的实际代码。
import React, { Component } from 'react';
import ReactSVG from 'react-svg';
import logo from './logo.svg';
import avatar from './avatar.jpg'
import './component.css'
import Msg from './components/Msg';
import ItemMsg from './components/ItemMsg';
import Sidebar from './components/Sidebar';
var ids = [];
var componente = [];
class App extends Component {
componentDidMount() {
fetch('/todos/ids')
.then((response) => response.json())
.then((responseJson) => ids = responseJson.data)
.then(console.log)
}
render() {
var id;
for (var i = 0; i < ids.length; i++) {
id = ids[i];
componente.push(<li><ItemMsg idfromparent={id}/></li>);
}
return (
<div>
<Sidebar/>
<Msg/>
<ul>
{componente}
</ul>
</div>
);
}
}
export default App;
试试这样的东西:
import React, { Component } from 'react';
import ReactSVG from 'react-svg';
import logo from './logo.svg';
import avatar from './avatar.jpg'
import './component.css'
import Msg from './components/Msg';
import ItemMsg from './components/ItemMsg';
import Sidebar from './components/Sidebar';
class App extends Component {
componentDidMount() {
fetch('/todos/ids')
.then((response) => response.json())
.then((responseJson) => this.setState({ids: responseJson.data}))
.then(console.log)
}
render() {
var ids = this.state && this.state.ids ? this.state.ids : [];
var componente = [];
for (var i = 0; i < this.state.ids.length; i++) {
componente.push(<li><ItemMsg key={ids[i]} idfromparent={ids[i].ID_Publicacion}/></li>);
}
return (
<div>
<Sidebar/>
<Msg/>
<ul>
{componente}
</ul>
</div>
);
}
}
export default App;
您的问题不是列表 ids
的值没有更新,而是。这里的问题是你的组件没有理由根据该变量的变化重新渲染,即使它在它的渲染中使用它。触发组件重新渲染的唯一方法是调用 setState
.
一种方法是使用 componentDidMount
生命周期挂钩。执行异步调用,然后调用 setState
。重新渲染组件并使用 state.users
的填充值。
这是一个人为的例子。我相信你可以根据你的情况进行调整:
class App extends React.Component {
constructor() {
super();
this.state = {
users: []
};
}
componentDidMount() {
fetch('/users')
.then(users => this.setState({ users });
}
render() {
return (
<ul>
{
this.state.users && this.state.users.map(user => <li> { user.name } </li>);
}
</ul>
);
}
}
我之前从 API 中获取了一个数组。我将它保存到变量 "ids" 中。问题是 "ids" 变量在渲染中为空。如何查看我保存在 "ids" 变量中的先前声明的值?
这是我的实际代码。
import React, { Component } from 'react';
import ReactSVG from 'react-svg';
import logo from './logo.svg';
import avatar from './avatar.jpg'
import './component.css'
import Msg from './components/Msg';
import ItemMsg from './components/ItemMsg';
import Sidebar from './components/Sidebar';
var ids = [];
var componente = [];
class App extends Component {
componentDidMount() {
fetch('/todos/ids')
.then((response) => response.json())
.then((responseJson) => ids = responseJson.data)
.then(console.log)
}
render() {
var id;
for (var i = 0; i < ids.length; i++) {
id = ids[i];
componente.push(<li><ItemMsg idfromparent={id}/></li>);
}
return (
<div>
<Sidebar/>
<Msg/>
<ul>
{componente}
</ul>
</div>
);
}
}
export default App;
试试这样的东西:
import React, { Component } from 'react';
import ReactSVG from 'react-svg';
import logo from './logo.svg';
import avatar from './avatar.jpg'
import './component.css'
import Msg from './components/Msg';
import ItemMsg from './components/ItemMsg';
import Sidebar from './components/Sidebar';
class App extends Component {
componentDidMount() {
fetch('/todos/ids')
.then((response) => response.json())
.then((responseJson) => this.setState({ids: responseJson.data}))
.then(console.log)
}
render() {
var ids = this.state && this.state.ids ? this.state.ids : [];
var componente = [];
for (var i = 0; i < this.state.ids.length; i++) {
componente.push(<li><ItemMsg key={ids[i]} idfromparent={ids[i].ID_Publicacion}/></li>);
}
return (
<div>
<Sidebar/>
<Msg/>
<ul>
{componente}
</ul>
</div>
);
}
}
export default App;
您的问题不是列表 ids
的值没有更新,而是。这里的问题是你的组件没有理由根据该变量的变化重新渲染,即使它在它的渲染中使用它。触发组件重新渲染的唯一方法是调用 setState
.
一种方法是使用 componentDidMount
生命周期挂钩。执行异步调用,然后调用 setState
。重新渲染组件并使用 state.users
的填充值。
这是一个人为的例子。我相信你可以根据你的情况进行调整:
class App extends React.Component {
constructor() {
super();
this.state = {
users: []
};
}
componentDidMount() {
fetch('/users')
.then(users => this.setState({ users });
}
render() {
return (
<ul>
{
this.state.users && this.state.users.map(user => <li> { user.name } </li>);
}
</ul>
);
}
}