将对象转换成数组 React

3
我正在使用React,并想要做类似于这样的事情:

enter image description here

蓝色方块最初是隐藏的,取决于用户选择哪个 Colecao,它们会显示出来。因此,一些带有一些 Colecao 内容的 Classes,每个都有“方块”。这是我的 app.js:

class App extends Component {
    constructor(props) {
        super(props);

        this.state = {

            activeTab: 'Classe 1',


            tabs: [
                {
                    tituloTab: 'Classe 1',
                    colecoes: [{
                        'Colecao 1': [
                            'A', 'B', 'C', 'D'
                        ],
                        'Colecao 2': [
                            'A', 'B', 'C', 'D', 'E'
                        ],
                    }]
                },
                {
                    tituloTab: 'Classe 2',
                    colecoes: [{
                        'Colecao 1': [
                            'A', 'B', 'C', 'D'
                        ],
                        'Colecao 2': [
                            'A', 'B', 'C', 'D', 'E'
                        ],
                    }]
                },
                {
                    tituloTab: 'Classe 3',
                    colecoes: [{
                        'Colecao 1': [
                            'A', 'B', 'C', 'D'
                        ],
                        'Colecao 2': [
                            'A', 'B', 'C', 'D', 'E'
                        ],
                        'Colecao 3': [
                            'A', 'B', 'C'
                        ],
                    }]
                },
                {
                    tituloTab: 'Classe 4',
                    colecoes: [{
                        'Colecao 1': [
                            'A', 'B', 'C', 'D'
                        ],
                        'Colecao 2': [
                            'A', 'B', 'C', 'D', 'E'
                        ],
                        'Colecao 3': [
                            'A', 'B', 'C'
                        ],
                        'Colecao 4': [
                            'A', 'B', 'C', 'D', 'E', 'F'
                        ],
                    }],
                }
            ],

            ThumbnailsColecoes: [
                {
                    tituloThumbnail: 'Costas',
                    texturas: ['A', 'B', 'C', 'D'],
                }
            ],

            colecaoSelecionada:
                '',

            toggleThumbnailsColecoes:
                false,
        };
    }

    changeActiveTab(tab) {
        this.setState({activeTab: tab});
    }

    activeTabContent() {
        const activeIndex = this.state.tabs.findIndex((tab) => {
                return tab.tituloTab === this.state.activeTab;
            }
        );
        return this.state.tabs[activeIndex].colecoes;
    }

    adicionarColecaoSelecionada(colecao) {
        this.setState({colecoesSelecionadas: colecao}, () => {
                this.setState({toggleThumbnailsColecoes: true})
            }
        )
    }

    render() {

        return (
            <div className={"container is-fluid"}>
                        <TabsArea
                            activeTab={this.state.activeTab}
                            tabList={this.state.tabs}
                            changeActiveTab={this.changeActiveTab.bind(this)}
                            colecoes={this.activeTabContent()}
                            addColecao={this.adicionarColecaoSelecionada.bind(this)}
                            colecoesThumbnails={this.state.ThumbnailsColecoes}
                            toggleThumbnails={this.state.toggleThumbnailsColecoes}/>
                    </Options>
                </section>
            </div>
        );
    }
}

export default App;

我的tabsArea.js

class TabsArea extends Component {
    render() {

        return (

            <div className={["section", "tabsArea"].join(' ')}>

                <TabsHeader
                    activeTab={this.props.activeTab}
                    tabList={this.props.tabList}
                    changeActiveTab={this.props.changeActiveTab}
                />

                <TabContent
                    key={this.props.activeTab}
                    colecoes={this.props.colecoes}
                    addColecao={this.props.addColecao}/>
                <hr/>

                {//should get the Thumbnails for each "Colecao"
                    this.props.toggleThumbnails
                        ? <ThumbnailAreas
                            thumbnailAreas={this.props.colecoesThumbnails}>
                        </ThumbnailAreas>
                        : null
                }

            </div>
        )
    }
}

export default TabsArea;

tabContent.js

class TabContent extends Component {
    constructor(props) {
        super(props);
    }

    render() {

        return (

            <div>
                <ul className={"uList"}>
                    {this.props.colecoes.map((list) => {
                            return <li className={"li"}>
                                <a className={"has-text-black"}
                                   onClick={() => this.props.addColecao(list)}>
                                    {list} //should get the list of "Colecao"
                                </a>
                            </li>
                        }
                    )}
                </ul>
            </div>
        )
    }
}

export default TabContent;
titulo 标签就像我的 TabHeadercolecoes 是列表项中的每一个,字母数组应该对应每个方块。问题是我的 tabs 元素是一个对象,我不确定如何将其传递给一个 array。另外,我应该在我的 app.js 中进行,并将数组作为 props 传递,还是将对象传递并在组件上转换为 array

谢谢

2个回答

1
使用 lodash 库:
var arr = _.values(obj);

如果您需要在app.js中用于其他目的,请在那里处理,否则无关紧要。

抱歉,但我可能漏掉了什么。当我使用console.log打印我的选项卡和“let array = _.values(this.state.tabs);”时,我得到了相同的结果... - Nelson Silva
抱歉,我的错误。我以为你需要将一个对象转换成数组。现在我看到你的对象中有一个项目,它是一个数组,而这个数组的每个项目都是一个只包含一个对象的数组...很复杂...我会尝试定义一个更简单的状态,但现在没有时间深入研究,抱歉... - Yossi
没问题。我不确定这是否是设置状态的最佳方式,稍后它将从API获取数据,并且将像“3”层选项一样:选择一个选项卡,每个选项卡都将有一个列表,列表上的每个项目都将具有相应的缩略图。谢谢,任何帮助将不胜感激。 - Nelson Silva

0
如果您将在多个地方使用数组值,则最明智的做法是在app.js中进行转换,并将数组传递到需要的位置。
如果您只会在一个组件中使用数组值,请将对象传递给它,并让它执行任何app.js不需要关心的操作。
至于将对象转换为数组,有许多方法可以做到这一点,这取决于您的具体用例。从您的示例中看,tabs已经是一个数组了...我错过了什么吗?

是的,它是一个数组,但作为具有键的对象传递,对吧?很可能是我漏掉了什么,第一次使用这个... - Nelson Silva
只需将数组传递到组件中的任何函数中,并在那里循环即可...应该可以工作,我不明白为什么不行。在JavaScript中,所有东西都是“对象”,因此从这个意义上说,是的,您的数组是一个对象,但它仍然是一个可循环的数组。 - Lansana Camara
尝试过了,但是我得到了“对象不适用于React子元素(发现具有键{Colecao 1,Colecao 2}的对象)。如果您想呈现一组子元素,请改用数组。” - Nelson Silva
请问您能否展示一下您如何使用代码?请在问题中编辑更新后的代码。也许您使用它不当。尝试做类似于<MyChildComponent tabs={this.state.tabs} />这样的事情。由于tabs是一个数组,所以应该可以工作... - Lansana Camara
在你的 TabContent 中,你正在执行 this.props.colecoes.map(list => ...)... 参数不会是一个列表,而是一个对象。map 函数的每次迭代都会传递一个单一的参数,而不是列表本身... 尝试更改它以及 addColecao 方法的内容,以期望一个对象而不是一个列表。 - Lansana Camara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接