Skip to content

Custom App Mounting

If you need more refined control over the mounting process, contrary to the regular Inertia.js installation, you may ignore the renderApp helper method and perform the mounting manually.

React

In React, you need to make changes to the app.jsx file and use a Layout component that renders the ModalRoot component after your main content.

Create a Layout Component

First, create a Layout component that renders the ModalRoot component after your main content. In this example, we are naming the component ModalLayout.jsx:

jsx
import { ModalRoot } from '@inertiaui/modal-react'

export default function ModalLayout({ children }) {
    return (
        <>
            {children}
            <ModalRoot />
        </>
    )
}

Update app.jsx

First, import your new Layout component and set it as the layout for your pages:

jsx
createInertiaApp({
    resolve: (name) => resolvePageComponent(`./Pages/${name}.jsx`, import.meta.glob('./Pages/**/*.jsx'))
        .then(function (page) { 
            page.default.layout = (page => <ModalLayout children={page} />) 
            return page; 
        }), 
});

If you find this cumbersome, you can also use the setPageLayout helper function to set the layout for all pages:

jsx
import { setPageLayout } from '@inertiaui/modal-react'

createInertiaApp({
    resolve: (name) => resolvePageComponent(`./Pages/${name}.jsx`, import.meta.glob('./Pages/**/*.jsx'))
        .then(setPageLayout(ModalLayout)), 
});

Next, you need to call the initFromPageProps method with the props object. Lastly, you need to wrap the App component within the ModalStackProvider component:

jsx
import { ModalStackProvider, initFromPageProps } from '@inertiaui/modal-react'

createInertiaApp({
    setup({ el, App, props }) {
        const root = createRoot(el);
        initFromPageProps(props) 

        root.render(
            <ModalStackProvider>
                <App {...props} />
            </ModalStackProvider> 
        );
    }
});

Vue

In Vue, it is a little bit simpler because you only need to make changes to the main app.js file. In this file, you need to call the initFromPageProps method with the props object. Then, you need to wrap the App component within the ModalRoot component:

js
import { ModalRoot, initFromPageProps } from '@inertiaui/modal-vue'

createInertiaApp({
    setup({ el, App, props, plugin }) {
        initFromPageProps(props) 

        return
            createApp({ render: () => h(App, props) }) 
            createApp({ render: () => h(ModalRoot, () => h(App, props)) }) 
            .use(plugin)
            .mount(el)
    }
})