如何在 useCallback 挂钩中传递参数?
How to pass an argument in useCallback hook?
我正在尝试使用 useCallback
挂钩,使用 gatsby-intl
插件更改语言,他们有一个方法 (changeLocale()
) 可以用来更改默认设置网站的语言。尽管解决方案有效,但我想避免在 JSX 箭头函数中传递道具,所以我尝试使用 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'),[]);
我也尝试过使用其他挂钩,例如 useState
,但它会创建太多渲染。
如何将参数传递给 useCallback
?如果不可能,哪个是最好的解决方法或方法?
onClick={switchLanguage(language.iso)}
调用switchLanguage
并将其return值设置为onClick
,就像onClick = switchLanguage(language.iso)
一样在 JSX 之外。
要将参数绑定到它,您需要使用包装函数:
onClick={() => switchLanguage(language.iso)}
...或bind
,虽然它也创建了一个函数:
onClick={switchLanguage.bind(null, language.iso)}
但是:在您的示例中使用useCallback
可能不会有太多收获。既然如此,你可能根本不需要 switchLanguage
:
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();
return <ul>
{languages.map((language, index) => <li key={index} onClick={() => changeLocale(language.iso)}>{language.name}</li>)}
</ul>;
};
我正在尝试使用 useCallback
挂钩,使用 gatsby-intl
插件更改语言,他们有一个方法 (changeLocale()
) 可以用来更改默认设置网站的语言。尽管解决方案有效,但我想避免在 JSX 箭头函数中传递道具,所以我尝试使用 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'),[]);
我也尝试过使用其他挂钩,例如 useState
,但它会创建太多渲染。
如何将参数传递给 useCallback
?如果不可能,哪个是最好的解决方法或方法?
onClick={switchLanguage(language.iso)}
调用switchLanguage
并将其return值设置为onClick
,就像onClick = switchLanguage(language.iso)
一样在 JSX 之外。
要将参数绑定到它,您需要使用包装函数:
onClick={() => switchLanguage(language.iso)}
...或bind
,虽然它也创建了一个函数:
onClick={switchLanguage.bind(null, language.iso)}
但是:在您的示例中使用useCallback
可能不会有太多收获。既然如此,你可能根本不需要 switchLanguage
:
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();
return <ul>
{languages.map((language, index) => <li key={index} onClick={() => changeLocale(language.iso)}>{language.name}</li>)}
</ul>;
};