javascript - React / Javascript在array.map中找不到元素
问题描述
import React, { Component } from "react";
class LogIssueScreen extends Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
fetch(`${apiRoot}log_issue`, {
method: "GET",
})
.then(response => response.json())
.then(data => {
this.setState({
fields: data.fields
});
});
}
render() {
return (
<div className="container-fluid">
{this.state.fields ? (
<div className="row">
<div className="col col-md-6 my-3 mx-auto">
this.state.fields.filter(x => (x.choices != null)).map((item,
index) => (
<div className="row align-items-center">
<div className="col-3">{item.name}</div>
<div className="col my-3 mx-auto">
<Dropdown
value={item.name}
choices={item.choices}
id={item.name}
/>
</div>
</div>
))
</div>
</div>
) : (
"LOADING"
)}
<div className="row">
<div className="col-2 my-3 mx-auto">
<input
type="button"
value="Log Issue"
className="btn btn-block btn-primary"
onClick={this.onSubmit}
/>
</div>
</div>
</div>
);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
我正在使用以下代码:
{
this.state.fields
? this.state.fields
.filter(x => x.choices != null)
.map((item, index) => (
<Dropdown
value={item.name}
choices={item.choices}
id={item.name}
onSelect={this.handleDropdownSelect}
/>
))
: "LOADING";
}
结果是三个副本'item' is not defined no-undef
。
目标是获取状态中的 'fields' 数组(对象),对其进行过滤,以便仅保留那些 'choices' 键不为空的元素,然后将结果数组映射到一系列下拉列表。我尝试将 {item.foo} 替换为字符串,以确认该Dropdown
组件没有任何问题,并且确实可以正常工作。由于某种原因,地图找不到“项目”。我还尝试删除键(即只是 item,而不是 item.foo),以检查这是否给出了不同的错误,但它没有。
解决方案
你是 JSX 中缺少的一对 ( {}
),你开始编写你的filter
方法。如果你想在 JSX 中使用 Javascript 表达式,那么你应该{}
再次使用 curlies ( )。
render() {
return (
<div className="container-fluid">
{this.state.fields ? (
<div className="row">
<div className="col col-md-6 my-3 mx-auto">
// here, curlies again
{this.state.fields
.filter(x => x.choices != null)
.map((item, index) => (
<div className="row align-items-center">
<div className="col-3">{item.name}</div>
<div className="col my-3 mx-auto">
<Dropdown
value={item.name}
choices={item.choices}
id={item.name}
/>
</div>
</div>
))}
</div>
</div>
) : (
"LOADING"
)}
<div className="row">
<div className="col-2 my-3 mx-auto">
<input
type="button"
value="Log Issue"
className="btn btn-block btn-primary"
onClick={this.onSubmit}
/>
</div>
</div>
</div>
);
}
模仿版:
const remoteData = {
fields: [
{ id: "1", name: "foo", choices: ["a"] },
{ id: "2", name: "bar", choices: ["b"] },
{ id: "3", name: "baz", choices: ["c"] },
],
};
const fakeRequest = () =>
new Promise(resolve => setTimeout(() => resolve(remoteData)));
class App extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
fakeRequest().then((data) => {
this.setState({
fields: data.fields,
});
});
}
render() {
return (
<div className="container-fluid">
{this.state.fields ? (
<div className="row">
<div className="col col-md-6 my-3 mx-auto">
{this.state.fields
.filter(x => x.choices != null)
.map(item => (
<div className="row align-items-center" key={item.id}>
<div className="col-3">{item.name}</div>
<div className="col my-3 mx-auto">
<Dropdown
value={item.name}
choices={item.choices}
id={item.name}
/>
</div>
</div>
))}
</div>
</div>
) : (
"LOADING"
)}
<div className="row">
<div className="col-2 my-3 mx-auto">
<input
type="button"
value="Log Issue"
className="btn btn-block btn-primary"
onClick={this.onSubmit}
/>
</div>
</div>
</div>
);
}
}
const Dropdown = ({ name, id }) => (
<div>
<p>{name}</p>
<p>{id}</p>
</div>
);
ReactDOM.render(
<App />,
document.getElementById("root")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
推荐阅读
- c - ncurses中的nodelay()和cbreak()有什么区别?
- c# - 双向链接到 ListView 的所有 SelectedItems 的属性?
- c++ - 指向失去价值的对象向量的指针
- android - 如何处理类型不匹配 - 字符串和字符串?
- javascript - 如何在表格中允许 xss
- javascript - Electron 选择带有文本输入和 onclick 事件的目录
- java - 将 EditText 值从 android 发送到 PHP 文件并执行 PHPmailer send() 函数
- python - 使用networkx的有向网络和边缘权重
- android - 如何本地链接库并避免冲突?
- node.js - npm install -g firebase-tools 导致错误