在反应中从 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} />;
        });