在反应中从 json 数据动态生成列表
Dynamically generate list from json data in react
我正在使用 primereact
生成 table,我想实现 ColToggle
这是 link
https://www.primefaces.org/primereact/#/datatable/coltoggle
。由于我从 JSON Server
动态生成列,我想为 ColToggle
实现动态生成此下拉列表,因为我从用户输入中获取 api url 到 populate the dropdown
:
let columns = [
{field: 'vin', header: 'Vin'},
{field: 'year', header: 'Year'},
{field: 'brand', header: 'Brand'},
{field: 'color', header: 'Color'}
];
这就是我想要做的:
fetch(this.state.apiURL)
.then((response) => response.json())
.then((findresponse) =>{
this.setState({
columnSelector: findresponse.rootHeader
});
console.log(this.state.columnSelector);
this.state.columnSelector.map((col) => {
return this.columns_multiselect = [{field: col.field, header: col.header}];
})
console.log(this.columns_multiselect);
});
查看代码中的Map函数。 JSON link:
http://myjson.com/1620im
。
这应该是我的输出:
[
{field: 'vin', header: 'Vin'},
{field: 'year', header: 'Year'},
{field: 'brand', header: 'Brand'},
{field: 'color', header: 'Color'}
];
我该怎么做?
将您的映射更改为此
this.columns_multiselect = this.state.columnSelector.map((col) => {
return {field: col.field, header: col.header};
});
您可能正在寻找这个,
this.columns_multiselect = this.state.columnSelector.map(col => ({field: col.field, header: col.header}))
你实际上并没有用这个映射函数更新状态,所以 React 不知道要重新渲染。
例如
this.state.columnSelector.map((col) => {
return this.columns_multiselect = [{field: col.field, header: col.header}];
})
试试这个
this.setState({
columnOpts: this.state.columnSelector.map(col => ({
label:col.header,
value: { field:col.field, header: col.header }
})
)
})
...
<MultiSelect value={...} options={this.state.colOptions} .../>
每当对状态进行更改时,React 都会相应地更新 dom。
顺便说一句,如果您不返回值,我建议您使用 .foreach
循环而不是映射。无需分配额外的内存。
@Jadip 回答后,下拉列表已正确填充,但在取消选中下拉列表中的列时,它并没有消失。
问题已解决。我没有在下拉列表设置的新状态上生成列。
上一个:
var columns = this.state.jsonData.rootHeader.map((col,i) => {
return <Column key={i} field={col.field} header={col.header} sortable={this.state.isSortable} />;
});
现在:
var columns = this.state.cols.map((col,i) => {
return <Column key={i} field={col.field} header={col.header} sortable={this.state.isSortable} />;
});
我正在使用 primereact
生成 table,我想实现 ColToggle
这是 link
https://www.primefaces.org/primereact/#/datatable/coltoggle
。由于我从 JSON Server
动态生成列,我想为 ColToggle
实现动态生成此下拉列表,因为我从用户输入中获取 api url 到 populate the dropdown
:
let columns = [
{field: 'vin', header: 'Vin'},
{field: 'year', header: 'Year'},
{field: 'brand', header: 'Brand'},
{field: 'color', header: 'Color'}
];
这就是我想要做的:
fetch(this.state.apiURL)
.then((response) => response.json())
.then((findresponse) =>{
this.setState({
columnSelector: findresponse.rootHeader
});
console.log(this.state.columnSelector);
this.state.columnSelector.map((col) => {
return this.columns_multiselect = [{field: col.field, header: col.header}];
})
console.log(this.columns_multiselect);
});
查看代码中的Map函数。 JSON link:
http://myjson.com/1620im
。
这应该是我的输出:
[
{field: 'vin', header: 'Vin'},
{field: 'year', header: 'Year'},
{field: 'brand', header: 'Brand'},
{field: 'color', header: 'Color'}
];
我该怎么做?
将您的映射更改为此
this.columns_multiselect = this.state.columnSelector.map((col) => {
return {field: col.field, header: col.header};
});
您可能正在寻找这个,
this.columns_multiselect = this.state.columnSelector.map(col => ({field: col.field, header: col.header}))
你实际上并没有用这个映射函数更新状态,所以 React 不知道要重新渲染。
例如
this.state.columnSelector.map((col) => {
return this.columns_multiselect = [{field: col.field, header: col.header}];
})
试试这个
this.setState({
columnOpts: this.state.columnSelector.map(col => ({
label:col.header,
value: { field:col.field, header: col.header }
})
)
})
...
<MultiSelect value={...} options={this.state.colOptions} .../>
每当对状态进行更改时,React 都会相应地更新 dom。
顺便说一句,如果您不返回值,我建议您使用 .foreach
循环而不是映射。无需分配额外的内存。
@Jadip 回答后,下拉列表已正确填充,但在取消选中下拉列表中的列时,它并没有消失。
问题已解决。我没有在下拉列表设置的新状态上生成列。
上一个:
var columns = this.state.jsonData.rootHeader.map((col,i) => {
return <Column key={i} field={col.field} header={col.header} sortable={this.state.isSortable} />;
});
现在:
var columns = this.state.cols.map((col,i) => {
return <Column key={i} field={col.field} header={col.header} sortable={this.state.isSortable} />;
});