我正在尝试使用useCallback
钩子来改变语言,使用gatsby-intl
插件,它们有一个方法(changeLocale()
)可以用于更改网站的默认语言。我想避免在JSX箭头函数中传递props(虽然这个解决方案可行),因此我正在尝试使用useCallback
钩子。
onClick={()=>switchLanguage(language.iso)}
这是我的组件:
import React, { useCallback, useState } from 'react';
import { changeLocale } from 'gatsby-plugin-intl';
import { useLanguages } from '../../../hooks/useLanguages';
export const LanguageSwitcher = (callback, deps) => {
const languages = useLanguages();
const switchLanguage = useCallback(language => changeLocale(language),[]);
return <ul>
{languages.map((language, index) => <li key={index} onClick={switchLanguage(language.iso)}>{language.name}</li>)}
</ul>;
};
上面的代码创建了一个无限渲染,代码在没有点击
switchLanguage
函数的情况下进入。然而,如果我删除参数,它会按预期工作,但是我不知道用户点击的语言是什么。
const switchLanguage = useCallback(()=> console.log('item clicked'),[]);
我还尝试使用其他钩子(hooks),例如useState
,但它会创建太多的渲染。
我如何将参数传递给useCallback
?如果不可能,哪种是最好的解决方法或方法?
const switchLanguage = (language) => changeLocale(language);
并在onClick
事件中调用switchLanguage
。 - Ferran Buireuconst switchLanguage = (language) => changeLocale(language);
,然后调用switchLanguage。" 我认为在那个时候没有什么理由使用switchLanguage
,对吧?或者它除了调用changeLocale
还有其他作用吗? - T.J. Crowder