Читать json файл в Reactjs таким же образом, как я делаю это в Angular?

Вопрос или проблема

У меня есть файл json в папке assets моего проекта Angular. Я использую его для хранения общих подсказок и меток, чтобы не жестко кодировать их в своем HTML-коде. Сначала я покажу, как я читаю этот json файл в своем приложении.

Пример того, что у меня внутри:

"Tooltips": {
    "Editar": "Editar",
    "Eliminar": "Eliminar",
    "Ver": "Ver",
    "Footer": {
      "Facebook": "Seguinos en Facebook",
      "Twitter": "Seguinos en X",
      "Instagram": "Seguinos en Instagram",
      "Linkedin": "Seguinos en Linkedin",
      "YouTube": "Seguinos en YouTube"
    }
  }

У меня есть сервис, который предназначен для чтения этого json файла:

@Injectable()
export class ConfigService {
  private _tooltips: ITooltips
  constructor(private http: HttpClient) {
  }

  readData() {
    const promise = this.http
      .get('assets/config.json', { responseType: 'text' }).toPromise();

    promise.then(data => {
      const config = parseJson(data)
      this._tooltips = config['Tooltips']
    
    })

    return promise
  }

 public get tooltips(): ITooltips {
    return this._tooltips
  }

interface ITooltips {
  Editar: string,
  Ver: string,
  Eliminar: string,

  Footer: {
    Facebook: string,
    Twitter: string,
    Instagram: string,
    Linkedin: string,
    YouTube: string
  }
}

“parseJson” ссылается на этот метод, который использует библиотеку strip-json-comments:

export function parseJson(jsonText: string): any {
  const stripedJson = stripJsonComments(jsonText)
  const json = JSON.parse(stripedJson)

  return json
}

Код внутри app.module.ts:

export function initializeApp(config: ConfigService) {
  return () => config.readData()
}

@NgModule({
  declarations: [
  ],
  imports: [
  ],

  schemas: [CUSTOM_ELEMENTS_SCHEMA],
  providers: [
    ConfigService,
    {
      provide: APP_INITIALIZER,
      useFactory: initializeApp,
      deps: [ConfigService],
      multi: true,
    }

  ],
  bootstrap: [AppComponent]
})

Все это позволяет мне внедрить сервис ConfigService в любой из моих компонентов и читать файл config.json, что, на мой взгляд, очень удобно.

Сейчас я собираюсь начать новый проект Reactjs на своей работе. У меня мало или совсем нет опыта в Reactjs, мы сначала пройдем кучу обучения, но я думал об этой конкретной части моего приложения на Angular.

Я хотел бы “перевести” этот код с Angular на Reactjs. Я хочу иметь возможность сопоставить файл json с одним или несколькими интерфейсами чем-то, похожим на сервис Angular, чтобы я мог внедрить его и читать файл из любого места в моем приложении Reactjs. Как я могу это сделать? Какие библиотеки вы порекомендуете?

Почему бы не использовать файл контекста вместо json, это лучший подход:

Сначала создайте файл с именем ToolTips.js

const Tooltips = {
    Editar: "Editar",
    Eliminar: "Eliminar",
    Ver: "Ver",
    Footer: {
        Facebook: "Seguinos en Facebook",
        Twitter: "Seguinos en X",
        Instagram: "Seguinos en Instagram",
        Linkedin: "Seguinos en Linkedin",
        YouTube: "Seguinos en YouTube"
    }
}

export { Tooltips }

Затем создайте файл контекста Tooltips, как это:

import React, { createContext, useContext } from 'react';
import { ToolTips } from '../Constants/ToolTips';

const ToolTipsContext = createContext();

export const ToolTipsProvider = ({ children }) => {
  return (
    <ToolTipsContext.Provider value={{ ToolTips }}>
      {children}
    </ToolTipsContext.Provider>
  );
};

export const useToolTips = () => useContext(ToolTipsContext);

Затем используйте контекст в приложении так:

import React from 'react';
import { ToolTipsProvider } from './context/ToolTipsContext';
import TooltipComponent from './components/TooltipComponent';

const App = () => {
  return (
    <ToolTipsProvider>
      <div>
        <h1>Мое приложение</h1>
        <AnyComponent/>
      </div>
    </ToolTipsProvider>
  );
};

export default App;

Затем вы можете использовать это в своем компоненте так:

import React from 'react';
import { useToolTips } from '../context/ToolTipsContext';

const AnyComponent= () => {
  const { Tooltips } = useToolTips();

  return (
    <div>
      <h2>Пример подсказок</h2>
      <ul>
        <li>{Tooltips.Editar}</li>
        <li>{Tooltips.Eliminar}</li>
        <li>{Tooltips.Ver}</li>
        <h3>Футер</h3>
        <ul>
          <li>{Tooltips.Footer.Facebook}</li>
          <li>{Tooltips.Footer.Twitter}</li>
          <li>{Tooltips.Footer.Instagram}</li>
          <li>{Tooltips.Footer.Linkedin}</li>
          <li>{Tooltips.Footer.YouTube}</li>
        </ul>
      </ul>
    </div>
  );
};

export default AnyComponent;

Таким образом, вы можете использовать подсказки в любом компоненте приложения, даже если страниц будет 1000, подсказки можно использовать во всех них без повторения кода.

Ответ или решение

Для реализации функциональности по чтению JSON файла в React.js, аналогично тому, как вы это делали в Angular, вам понадобится создать контекст, который будет управлять состоянием и предоставлять данные из JSON файла в любом компоненте вашего приложения. Давайте рассмотрим это подробнее.

1. Структура JSON файла

Исходный JSON файл, который вы использовали в Angular, может выглядеть следующим образом:

{
  "Tooltips": {
    "Editar": "Редактировать",
    "Eliminar": "Удалить",
    "Ver": "Просмотреть",
    "Footer": {
      "Facebook": "Подписывайтесь на нас в Facebook",
      "Twitter": "Подписывайтесь на нас в X",
      "Instagram": "Подписывайтесь на нас в Instagram",
      "Linkedin": "Подписывайтесь на нас в Linkedin",
      "YouTube": "Подписывайтесь на нас в YouTube"
    }
  }
}

2. Чтение JSON файла

Для того чтобы читать JSON файл в React, вы можете воспользоваться встроенными API, такими как fetch. Предположим, что ваш JSON файл называется config.json и находится в папке public.

3. Создание контекста для управления состоянием

Создайте файл TooltipsContext.js для вашего контекста:

import React, { createContext, useContext, useEffect, useState } from 'react';

const TooltipsContext = createContext();

export const TooltipsProvider = ({ children }) => {
  const [tooltips, setTooltips] = useState(null);

  useEffect(() => {
    const fetchTooltips = async () => {
      const response = await fetch('/config.json');
      const data = await response.json();
      setTooltips(data.Tooltips);
    };

    fetchTooltips();
  }, []);

  return (
    <TooltipsContext.Provider value={tooltips}>
      {children}
    </TooltipsContext.Provider>
  );
};

export const useTooltips = () => {
  return useContext(TooltipsContext);
};

4. Использование контекста в приложении

Теперь интегрируйте ваш контекст в корневом компоненте приложения (обычно App.js):

import React from 'react';
import { TooltipsProvider } from './context/TooltipsContext';
import SomeComponent from './components/SomeComponent';

const App = () => {
  return (
    <TooltipsProvider>
      <div>
        <h1>Мое приложение</h1>
        <SomeComponent />
      </div>
    </TooltipsProvider>
  );
};

export default App;

5. Доступ к тултипам в компоненте

Теперь вы можете использовать ваши тултипы в любом компоненте:

import React from 'react';
import { useTooltips } from '../context/TooltipsContext';

const SomeComponent = () => {
  const tooltips = useTooltips();

  if (!tooltips) {
    return <div>Загрузка...</div>; // Ожидание загрузки данных
  }

  return (
    <div>
      <h2>Пример Тултипов</h2>
      <ul>
        <li>{tooltips.Editar}</li>
        <li>{tooltips.Eliminar}</li>
        <li>{tooltips.Ver}</li>
        <h3>Footer</h3>
        <ul>
          <li>{tooltips.Footer.Facebook}</li>
          <li>{tooltips.Footer.Twitter}</li>
          <li>{tooltips.Footer.Instagram}</li>
          <li>{tooltips.Footer.Linkedin}</li>
          <li>{tooltips.Footer.YouTube}</li>
        </ul>
      </ul>
    </div>
  );
};

export default SomeComponent;

Заключение

Таким образом, вы сможете легко интегрировать JSON данные в ваше React приложение, используя контекст для управления состоянием и обеспечения доступа к данным во всех компонентах. Этот подход обеспечивает гибкость, так как вы можете изменять содержимое JSON файла без изменения кода компонентов. Надеюсь, это поможет вам эффективно адаптировать вашу Angular логику в React.

Оцените материал
Добавить комментарий

Капча загружается...