我们可以在其他反应组件中完全完成之前使用组件吗
can we use component before its completely finished in other react component
我在 react/Javascript
中遇到一个奇怪的问题我的下面的文件调用了 backend API
中的数据并将其分配给翻译。
import i18next from 'i18next';
import apiDelegate from '../src/components/Utils/Common/api.js';
const LanguageDetector = require('i18next-browser-languagedetector');
const initReactI18next = require('react-i18next');
var output;
//API call
apiDelegate.getTranslations().then((result) => {
output = JSON.stringify(result);
const tr_fr = 'translation: ' +JSON.parse(output) ;
alert(tr_fr);
i18next
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources: {
en: tr_fr,
},
fallbackLng: 'fr',
});
i18next.changeLanguage(navigator.language);
});
export default i18next;
下面几行用于调用backedn API。
apiDelegate.getTranslations()
它returns数据的形式是key value
。
对于前 {name:"Mahima",company:"Infosys",address:"Bangalore India"}
我在我的 react componenet
中使用这些属性使用下面的行。
i18n.t("name");
i18n.t("company")
等等
是否有可能在 apiDelegate()
完成其 execution.I 之前在我的组件中读取这些值意味着是否有可能 code
在其之前使用 i18
文件执行完毕。因为它没有反映 values
。如果我使用 static files
而不是 API
那么它就可以完美地工作。
请帮助我,我很难理解这一点。能解决吗?
如果您需要您的消费者等到语言设置完毕,您可以 return 来自此模块的承诺。类似于:
let ready = false;
const start = () => {
return new Promise((res) => {
if (ready) return res(i18next);
apiDelegate.getTranslations().then((result) => {
output = JSON.stringify(result);
const tr_fr = 'translation: ' + JSON.parse(output);
i18next
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources: {
en: tr_fr,
},
fallbackLng: 'fr',
});
i18next.changeLanguage(navigator.language);
});
ready = true;
return res(i18next);
});
};
export default start;
更新:这就是我可能使用它的方式。
export const useLanguage = () => {
const [l, setL] = useState({i18next});
useEffect(() => {
apiDelegate.getTranslations().then((result) => {
// ...
i18next.changeLanguage(navigator.language);
setL({i18next});
});
}, []);
return l;
};
这似乎是以下内容的重复:
- Code is working when reading data from file but not API
您可能想使用 i18next-http-backend:
我在 react/Javascript
中遇到一个奇怪的问题我的下面的文件调用了 backend API
中的数据并将其分配给翻译。
import i18next from 'i18next';
import apiDelegate from '../src/components/Utils/Common/api.js';
const LanguageDetector = require('i18next-browser-languagedetector');
const initReactI18next = require('react-i18next');
var output;
//API call
apiDelegate.getTranslations().then((result) => {
output = JSON.stringify(result);
const tr_fr = 'translation: ' +JSON.parse(output) ;
alert(tr_fr);
i18next
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources: {
en: tr_fr,
},
fallbackLng: 'fr',
});
i18next.changeLanguage(navigator.language);
});
export default i18next;
下面几行用于调用backedn API。
apiDelegate.getTranslations()
它returns数据的形式是key value
。
对于前 {name:"Mahima",company:"Infosys",address:"Bangalore India"}
我在我的 react componenet
中使用这些属性使用下面的行。
i18n.t("name");
i18n.t("company")
等等
是否有可能在 apiDelegate()
完成其 execution.I 之前在我的组件中读取这些值意味着是否有可能 code
在其之前使用 i18
文件执行完毕。因为它没有反映 values
。如果我使用 static files
而不是 API
那么它就可以完美地工作。
请帮助我,我很难理解这一点。能解决吗?
如果您需要您的消费者等到语言设置完毕,您可以 return 来自此模块的承诺。类似于:
let ready = false;
const start = () => {
return new Promise((res) => {
if (ready) return res(i18next);
apiDelegate.getTranslations().then((result) => {
output = JSON.stringify(result);
const tr_fr = 'translation: ' + JSON.parse(output);
i18next
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources: {
en: tr_fr,
},
fallbackLng: 'fr',
});
i18next.changeLanguage(navigator.language);
});
ready = true;
return res(i18next);
});
};
export default start;
更新:这就是我可能使用它的方式。
export const useLanguage = () => {
const [l, setL] = useState({i18next});
useEffect(() => {
apiDelegate.getTranslations().then((result) => {
// ...
i18next.changeLanguage(navigator.language);
setL({i18next});
});
}, []);
return l;
};
这似乎是以下内容的重复:
- Code is working when reading data from file but not API
您可能想使用 i18next-http-backend: