如何在 React 中呈现 objects 数组的属性?
How to render properties of an Array of objects in React?
所以,我和我们的朋友有完全相同的问题:
Nahush Farkande 的以下(赞成)解决方案:
render() {
let user = this.props.user || {};
....
{user.email}
....
}
对我有用...如果 user 是 object。但是,在我的具体情况下,我获取并要呈现的数据是 objects.
的数组
所以,我 return 类似的东西 :
<ul>
{
user.map( (el, idx) => {
return (
<li key = {idx}>
<div className="panel-body clearfix">
{el.title}
</div>
</li>
)
})
}
</ul>
那是行不通的。我收到一条错误消息,告诉我 user.map 不是一个函数(在 [HMR] 连接之前)。
我预计一旦 API 获取 object 的用户数组,该组件将 re-render 然后该组件将显示每个 [=33] 的标题列表=] 用户数组(连接 [HMR] 后)。
如果你的user
(我建议重命名为users
)是一个数组,那么你不能使用{}
作为默认值。您应该使用 []
作为默认值:
const user = this.props.user || []
或者,您可以使用完全不同的分支来处理加载情况:
if (!this.props.user) {
return (
<div> ... my loading placeholder ... </div>
);
}
您已经有了正确答案,但只是想举一个 运行 例子。
使用默认值初始化您所在州的数据,例如
如果是object -> {}
以防万一 array -> []
显然,在每种情况下,您的渲染逻辑应该不同,例如,在数组的情况下,您需要 map
遍历数组并生成 jsx element
.
因此,当您的组件通过 api 调用或通过 prop 更改接收到更新数据(它可以是空数据或完整数据)时,请使用适当的生命周期方法,例如 componentWillReceiveProps
或 componentDidMount
获取最新数据并再次使用最新数据设置状态。
例如,当通过 api 调用 ->
接收数据时
constructor() {
this.state = {
data : []
}
}
componentDidMount()
{
this.getFunction();
}
getFunction = () => {
this.ApiCall()
.then(
function(data){
console.log(data);
// set the state here
this.setState({data:data});
},
function(error){
console.log(error);
}
);
}
因此在初始渲染时,您的数据将是空对象或空数组,您将相应地调用适当的渲染方法。
class Test extends React.Component {
constructor(props) {
super(props);
this.state = {
data : []
}
}
componentWillMount() {
this.setState({ data : this.props.dp });
}
renderFromProps() {
return this.state.data
.map((dpElem) =>
<h3>{dpElem.name}</h3>
);
}
render() {
return (
<div>
<h1> Rendering Array data </h1>
<hr/>
{ this.renderFromProps()}
</div>
);
}
}
const dynamicProps = [{ name:"Test1", type:"String", value:"Hi1" },
{ name:"Test2", type:"String", value:"Hi2" },
{ name:"Test3", type:"String", value:"Hi3" }
];
ReactDOM.render(
<Test dp={dynamicProps} />,
document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root">
</div>
所以,我和我们的朋友有完全相同的问题:
Nahush Farkande 的以下(赞成)解决方案:
render() {
let user = this.props.user || {};
....
{user.email}
....
}
对我有用...如果 user 是 object。但是,在我的具体情况下,我获取并要呈现的数据是 objects.
的数组所以,我 return 类似的东西 :
<ul>
{
user.map( (el, idx) => {
return (
<li key = {idx}>
<div className="panel-body clearfix">
{el.title}
</div>
</li>
)
})
}
</ul>
那是行不通的。我收到一条错误消息,告诉我 user.map 不是一个函数(在 [HMR] 连接之前)。
我预计一旦 API 获取 object 的用户数组,该组件将 re-render 然后该组件将显示每个 [=33] 的标题列表=] 用户数组(连接 [HMR] 后)。
如果你的user
(我建议重命名为users
)是一个数组,那么你不能使用{}
作为默认值。您应该使用 []
作为默认值:
const user = this.props.user || []
或者,您可以使用完全不同的分支来处理加载情况:
if (!this.props.user) {
return (
<div> ... my loading placeholder ... </div>
);
}
您已经有了正确答案,但只是想举一个 运行 例子。
使用默认值初始化您所在州的数据,例如
如果是object -> {}
以防万一 array -> []
显然,在每种情况下,您的渲染逻辑应该不同,例如,在数组的情况下,您需要 map
遍历数组并生成 jsx element
.
因此,当您的组件通过 api 调用或通过 prop 更改接收到更新数据(它可以是空数据或完整数据)时,请使用适当的生命周期方法,例如 componentWillReceiveProps
或 componentDidMount
获取最新数据并再次使用最新数据设置状态。
例如,当通过 api 调用 ->
接收数据时 constructor() {
this.state = {
data : []
}
}
componentDidMount()
{
this.getFunction();
}
getFunction = () => {
this.ApiCall()
.then(
function(data){
console.log(data);
// set the state here
this.setState({data:data});
},
function(error){
console.log(error);
}
);
}
因此在初始渲染时,您的数据将是空对象或空数组,您将相应地调用适当的渲染方法。
class Test extends React.Component {
constructor(props) {
super(props);
this.state = {
data : []
}
}
componentWillMount() {
this.setState({ data : this.props.dp });
}
renderFromProps() {
return this.state.data
.map((dpElem) =>
<h3>{dpElem.name}</h3>
);
}
render() {
return (
<div>
<h1> Rendering Array data </h1>
<hr/>
{ this.renderFromProps()}
</div>
);
}
}
const dynamicProps = [{ name:"Test1", type:"String", value:"Hi1" },
{ name:"Test2", type:"String", value:"Hi2" },
{ name:"Test3", type:"String", value:"Hi3" }
];
ReactDOM.render(
<Test dp={dynamicProps} />,
document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root">
</div>