Javascript “反应钩”;使用翻译“;在函数“中调用”;getMyMenu";它既不是React函数组件,也不是自定义React钩子函数
我在一个普通函数中调用Javascript “反应钩”;使用翻译“;在函数“中调用”;getMyMenu";它既不是React函数组件,也不是自定义React钩子函数,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我在一个普通函数中调用useTranslation钩子,如下所示 import { useTranslation } from "react-i18next"; function getMyMenu(a) { const { t } = useTranslation('translations'); if (a.showRoute) { a.label = t(a.label); return a; } } export con
useTranslation
钩子,如下所示
import { useTranslation } from "react-i18next";
function getMyMenu(a) {
const { t } = useTranslation('translations');
if (a.showRoute) {
a.label = t(a.label);
return a;
}
}
export const MyNav = props => {
let tabs = recurseFn(getMyMenu, props.routes);
}
我得到以下错误。没有办法解决这个问题吗?出于某种奇怪的原因,我能够在其他项目中看到类似的代码模式。需要任何额外的配置来实现这一点吗
更新:
这就是我的recurseFn
的样子:
export const recurseFn = (chk, [head, ...tail]) => {
if (head === undefined) return [];
if (chk(head)) {
return [head, ...recurseFn(chk, tail)];
}
return [...recurseFn(chk, tail)];
};
您可以通过将
usetransation
钩子移动到MyNav
组件主体并在getMyMenu
中将翻译函数t
作为闭包传递来修复它
import { useTranslation } from "react-i18next";
export const MyNav = props => {
const { t } = useTranslation('translations');
function getMyMenu(a) {
if (a.showRoute) {
a.label = t(a.label);
return a;
}
}
let tabs = recurseFn(getMyMenu, props.routes);
...
}
编辑
我刚刚更新了我的recurseFn
的外观。有可能吗
把“t”传给它
解决方案1-将t
显式传递给所有函数
当然,您可以更新递归函数的函数签名,以同时使用一个“t”(translation?)函数,但是您还需要将t
传递到chk
中,这需要更新原始的getMyMenu
函数以使用额外的参数
例如:
function getMyMenu(t, a) { // <-- consume additional t argument
if (a.showRoute) {
a.label = t(a.label);
return a;
}
}
...
export const recurseFn = (chk, [head, ...tail], t) => { // <-- consume additional t argument
if (head === undefined) return [];
if (chk(t, head)) { // <-- pass t to chk
return [head, ...recurseFn(chk, tail, t)]; // <-- pass t on recursion
}
return [...recurseFn(chk, tail, t)]; // <-- pass t on recursion
};
...
import { useTranslation } from "react-i18next";
export const MyNav = props => {
const { t } = useTranslation('translations');
let tabs = recurseFn(getMyMenu, props.routes, t); // <-- pass t on recursion
...
}
现在,从usetransation
hook返回值中解构t
,并传递到curriedgetMyMenu
函数。这类似于在回调函数中关闭t
函数,就像我们在第一个答案中所做的那样
import { useTranslation } from "react-i18next";
export const MyNav = props => {
const { t } = useTranslation('translations');
let tabs = recurseFn(getMyMenu(t), props.routes);
...
}
现在从
recurseFn
的角度来看,t
包含在chk
回调中,recurseFn
不需要显式地处理接收和传递t
。非常感谢……我刚刚更新了我的recurseFn的外观。可以把“t”传递给它吗?@testndtv当然,我已经用我相信你会问的问题更新了我的答案。再次感谢你…是的,所以我倾向于解决方案2…但是,在const getMyMenu=>t=>a=>{…}行上看到一个错误,错误是“const声明需要一个初始化值”@testndtv Oops,非常正确,一个太多的=>
,我已经更新了答案。它应该是const getMyMenu=t=>a=>{….
。对此感到抱歉。非常感谢……这似乎现在工作得很好……虽然是最后一个问题……所以退一步,虽然我们似乎应该从React函数组件或自定义React钩子函数中调用钩子,但是否有一些例外……因为我在另一个应用程序中看到了相同的代码,而且可能看起来ed工作得很好…有例外吗?
import { useTranslation } from "react-i18next";
export const MyNav = props => {
const { t } = useTranslation('translations');
let tabs = recurseFn(getMyMenu(t), props.routes);
...
}