В NextJS Возможно ли, чтобы пользовательский _app.js читал slug, getInitialProps и передавал эти реквизиты каждому компоненту, включая все страницы?

Я просмотрел документы, чтобы узнать, могу ли я _app.js прочитать слаг (об этом ничего не упоминалось). Мне нужно, чтобы этот слаг был добавлен в HTTP-запрос на получение, чтобы получить нужные данные, которые затем возвращают результаты в _app.js, в котором я затем могу передавать реквизиты всем компонентам и страницам.

Пример: когда я перехожу на http://localhost:3000/some-business-name, _app.js может получить ярлык (some-business-name), выполнить запрос и передать реквизиты всем компонентам и страницам проекта..

Но что я действительно изо всех сил пытаюсь сделать, так это передать свойства приложения всем остальным страницам внутри папки страниц.

В моей папке страниц есть:

  1. _app.js - (что мне нужно для передачи реквизита на все страницы)
  2. [slug].js - (корневая страница, которая использовалась для обнаружения slug, и теперь мне нужно, чтобы она просто получала реквизиты от _app.js)
  3. success.js - (нужно получать реквизиты от _app.js)
  4. error.js - (необходимо получить реквизит от _app.js)

Я использую файл данных, представляющий собой массив объектов бизнес-данных, с которыми я использую для тестирования динамической маршрутизации.

Я просмотрел документы NextJS, и у меня возникла проблема с пониманием того, как это можно сделать. Мне все еще нужно, чтобы пул существовал, мне просто нужна помощь в понимании того, как я могу заставить _app.js полностью взять на себя динамическую маршрутизацию.

Мой код для _app.js:

import React from 'react'
import App from 'next/app'
import { businesses } from '../data';

export default function MyApp({ Component, appProps }) {
  return (
    <Component appProps={appProps} />
  )
};

MyApp.getInitialProps = async ({ appContext }) => {
  const appProps = await App.getInitialProps(slug);
  return {appProps};
};

App.getInitialProps = async (slug) => {
  const business = businesses.filter((business) => {
    return business.slug === slug;
  });
  return business[0];
};

В настоящее время мой [slug].js:

import React from 'react';
import Head from 'next/head';
import LandingPage from '../components/landing-page';

export default function Slug(props) {
  return (
    <div>
      <Head>
        <title>Home</title>
        <link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css' integrity='sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm' crossOrigin='anonymous' />
        <link href='https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,600;0,700;0,800;1,300;1,400;1,600;1,700;1,800&display=swap' rel='stylesheet' />
        <script src='https://code.jquery.com/jquery-3.2.1.slim.min.js' integrity='sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN' crossOrigin='anonymous'></script>
        <script src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js' integrity='sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q' crossOrigin='anonymous'></script>
        <script src='https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js' integrity='sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl' crossOrigin='anonymous'></script>
      </Head>

      <LandingPage businessInfo={props.appProps}/>

      <style global jsx>{`
          body {
            font-family: 'Open Sans', sans-serif;
          }
        `}</style>
    </div>
  );
};

Удивительно, но я могу получать свойства приложения в компоненте LandingPage в [slug].js, но не на страницах success.js и error.js.

Любая помощь очень ценится! Спасибо!

2 ответа

Решение

Вы можете использовать что-то вроде этого:

import React from 'react'
import App from 'next/app'
import { Router } from '../routes'

class MyApp extends App {
  // Only uncomment this method if you have blocking data requirements for
  // every single page in your application. This disables the ability to
  // perform automatic static optimization, causing every page in your app to
  // be server-side rendered.
  //
  // static async getInitialProps(appContext) {
  //   // calls page's `getInitialProps` and fills `appProps.pageProps`
  //   const appProps = await App.getInitialProps(appContext);
  //
  //   return { ...appProps }
  // }

  render() {
    const { Component, appProps } = this.props
    // Workaround for https://github.com/zeit/next.js/issues/8592
    const { err } = this.props
    const modifiedPageProps = { ...appProps, err }
    return (
        <div id="comp-wrapp">
          <Component {...modifiedPageProps} />
        </div>
    )
  }
}

export default MyApp

Лучше бы это было

      class NextDocument extends Document {
static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx)
    const { req } = ctx
    // pass down everything u need there
    return { ...initialProps, locale }
}
Другие вопросы по тегам