Отреагировать на создание настроек меню

У меня есть боковая панель навигации, которые получают список JSON

import {
  AppSidebarNav,
} from '@coreui/react';
<AppSidebarNav  navConfig={navigation} {...this.props} />

а данные это список предметов

export default {
    items: [
      {
        name: 'Dashboard',
        url: '/dashboard',
        icon: 'icon-speedometer',
      },
      {
        name: 'Profile',
        url: '/profile',
        icon: 'icon-speedometer',
      },...
  ],
  };

Как я могу установить список элементов, прежде чем они загружаются на боковую панель? есть ли способ использовать componentDidMount()обновить список? как мне решить эту задачу

1 ответ

Поместите список элементов в свой собственный файл, скажем, nav.js. Затем добавьте эту строку в ваш импорт

    import navigation from "./nav"; // or whatever relative path nav.js is in.

Вы можете использовать этот пример код для выборки динамических данных по асинхронной, Await и AXIOS в AppSidebarNav ядра-интерфейсе

import React, {Component, Suspense} from "react";
import {
    AppSidebarNav,
    AppSidebar,
    AppSidebarFooter,
    AppSidebarForm,
    AppSidebarHeader,
    AppSidebarMinimizer,
} from "@coreui/react";
import axios from "axios";
import navigation from "../../_nav";

class SidebarNav extends Component {

    constructor(props) {
        super(props);
        this.state = {
            navData: null,
        };
    }

    async getData() {
        let res = await axios.get('REQUEST_URL');
        this.setState({ navData: {items : res });
        // OR // return await {items : res};
    };

    componentDidMount() {
        if (!this.state.navData) {
            (async () => {
                try {                 
                    await this.getData();
                    // OR // this.setState({navData: await this.getData()});
                } catch (e) {
                    //...handle the error...
                    console.log(e);
                }
            })();
        }
    }


    render() {
        return (
        <AppSidebar fixed display="lg">
            <AppSidebarHeader />
            <AppSidebarForm />
            <Suspense>
                <AppSidebarNav navConfig={(this.state.navData === null) ? navigation : this.state.navData} {...this.props} />
            </Suspense>
            <AppSidebarFooter />
            <AppSidebarMinimizer />
        </AppSidebar>
        )
    }
}

export default SidebarNav;
}

navigation переменная может использоваться для данных по умолчанию или для загрузки...

export default {
    items: [
        {
            name: 'Loading... ',
            url: '/'
        }
    ]
}

В последней части вызова SidebarNav компонента в DefaultLayout или где - нибудь.

Старый вопрос, но для тех, кто задается вопросом, как это сделать, я двинулся вперед, сделав следующее:

Родитель:

  • Конструктор установки и добавленная опора currentNavigation
  • Новая опора по умолчанию для навигации по умолчанию
  • Измените AppSidebarNav, чтобы использовать новую опору
  • Создайте функцию в родительском элементе, которая принимает объект навигации и обновляет новую опору currentNavigation
  • В этом примере я добавляю свой объект навигации к свойству с именем index в новом объекте это требуется для навигации CoreUI, кажется, однако вы можете сделать это в своем дочернем компоненте / при создании объекта навигации, который вы будете использовать для обновления меню.

    /** Parent **/
    
    import navigation from "../../navigation/_nav"
    
    class DefaultLayout extends Component {
    
        constructor(props) {
           super(props)
           this.currentNavigation = navigation //Set to default navigation from file
        }    
    
        functionFromParent = (yourNavObject) => {    
            // nav contains the navigation object (build this however you do), 
            // but needs to be added to { items: ... }
    
            let data = {
              items: yourNavObject
            }
            this.currentNavigation = data;
    
        }
    
        render = () => {
            return(
                // ...More code
    
                <AppSidebarNav
                  navConfig={this.currentNavigation} //Added function that child fires to prop
                  {...this.props}
                  router={router}
                />
    
               // More code...
            }
        }
    }
    

Ребенок:

  • Получите объект навигации, как бы вы его ни создавали, чтобы обновить меню
  • Передайте объект навигации в functionFromParent, используя props (this.props.functionFromParent(this.getYourNavigationObject()))

    /** Child **/
    class ChildComponent extends Component {
        // ... More Code
    
        componentDidMount = () => {    
           let navigation = this.getYourNavigationObject() //Get your navigation object however you do       
           this.props.functionFromParent(navigation)
        }
    
        // More Code ...
    }
    
Другие вопросы по тегам