Ame*_* Ra 5 javascript reactjs array.prototype.map
一位开发人员给了我一个 api 规范,它List
可以接受使用下面描述的形状的对象数组ListItem
;这将被转换为一组渲染List.Item
组件。
应用程序编程接口
该List
组件接受以下属性:
items
(ListItem[]
):必需的。该数组应包含一个或多个 JSX 元素,或者一个或多个ListItem
对象(详细信息请参见下文)。searchable
(string[]
): 选修的。接受与 ListItem 属性名称匹配的字符串数组。如果存在,则会在列表上方呈现本地化的自由格式搜索框,并且该字段中的输入将使用提供的键作为指导来过滤内部数据。模式
ListItem
ListItem
是列表中单个项目的对象架构。
{
// REQUIRED: The main title of the list item.
title: string,
// OPTIONAL: A secondary title.
subtitle: string,
// OPTIONAL: Additional labeling which appears directly below the title or subtitle label: String,
// OPTIONAL: If provided, a date will always appear at the top of the list item
date: Date,
// OPTIONAL: An array of actions which are appended to the right side of the list item.
actions: [
{
label: string | JSX.Element,
action: Function
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的实现不起作用
journalList.jsx
import PropTypes from "prop-types";
import React from "react";
import {Components} from "reusable-web-components";
const {
Icon,
List
} = Components;
const JournalList = (props) => {
const {description, title} = props;
const formattedItems = [
{
title: title,
description: description,
actions: [
{
label: <Icon name="edit" />,
action: () => {}
},
{
label: <Icon name="delete" />,
action: () => {}
}
]
}
];
return(
<List items={formattedItems} searchable={["title"]} />
)
}
JournalList.propTypes = {
"title": PropTypes.string.isRequired,
"description": PropTypes.string.isRequired
};
JournalList.defaultProps = {
};
export default JournalList;
Run Code Online (Sandbox Code Playgroud)
现在这是父组件
journal.jsx
import api from "bees";
import JournalList from './JournalList';
import React from "react";
import store from "store";
class Journal extends React.Component {
constructor (props) {
super(props)
this.state = {
"displayList": true,
"journalList": null,
"searchJournalList": []
}
}
componentDidMount = () => {
store.dispatch(api.getJournals()).then((result) => {
this.setState(() => ({"journalList": result.body.data}));
}).
catch(() => {
this.setState(() => ({"journalList": []}));
});
}
onEdit = () => {
// TODO: Update a Journal
}
onDelete = () => {
// TODO: Delete a Journal
}
render() {
return (
<div>
<JournalList>
{
journalList.map((items) => {
return{
key={items.title}
title={items.title}
description={items.description}
}
})
}
</JournalList>
</div>
)
}
}
export default Journal;
Run Code Online (Sandbox Code Playgroud)
我需要能够成功迭代从商店获取的数据并创建journal
条目列表。根据他的文档,输出应该如下所示:
<div>
<div class="list">
<div class="list__search">
<div class="form-group">
<input placeholder="Search" id="ListSearch_0.1429790340540955" class="form-control">
</div>
</div>
<div class="list__item">
<div class="list-item">
<div class="list-item__contents">
<div class="list-item-contents">
<div class="list-item-contents__title">Journal 1</div>
<div class="list-item-contents__title">Journal 2</div>
</div>
</div>
<div class="list-item__actions">
<button class="list-item-action"><svg class="icon icon--medium"><use xlink: href="#edit-icon"></use></svg></button>
<button class="list-item-action"><svg class="icon icon--medium"><use xlink: href="#delete-icon"></use></svg></button>
</div>
</div>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
The render method of your Journal
component should be like:
render() {
return (
<div>
{this.state.journalList.map((items) => {
<JournalList key={items.title}
title={items.title}
description={items.description}>
</JournalList>
})
}
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
And change the state declaration to:
this.state = {
displayList: true,
journalList: [],
searchJournalList: []
}
Run Code Online (Sandbox Code Playgroud)
You've reversed the order of the things. The map()
should wrap the component <JournalList>
, instead of the <JournalList>
wrap the journalList.map()
. Because the map
will iterate through the journalList
and create each component.
EDIT:
Your JournalList component is "unuseful". It is creating multiple lists, but you only needs one. Change your <JournalList>
to this:
render() {
return (
<div>
{this.state.journalList.map((items) => {
<JournalList key={items.title}
title={items.title}
description={items.description}>
</JournalList>
})
}
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
Doing this, you JournalList
component will be useful, and you won't need the <Journal>
Component.
归档时间: |
|
查看次数: |
15742 次 |
最近记录: |