Вопрос или проблема
У меня есть файл 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.