reducer.js
export const reducer = (state, action) => {
switch(action.type) {
case SET_HEROES:
return { ...state, heroes: action.heroes }
}
}
AppContext.js
export const AppContext = React.createContext()
export const AppProvider = (props) => {
const initialState = {
heroes: []
}
const [appState, dispatch] = useReducer(reducer, initialState)
const setHeroes = async () => {
const result = await getHeroes()
dispatch({ type: SET_HEROES, heroes: result })
}
return <AppContext.Provider
values={{ heroes: appState.heroes, setHeroes }}
>
{props.children}
</AppContext.Provider>
}
HeroesScreen.js
const HeroesScreen = () => {
const { heroes, setHeroes } = useContext(AppContext)
useEffect(() => {
setHeroes()
}, [])
return <>
// iterate hero list
</>
}
export default HeroesScreen
Выше простая настройка компонента с помощью reducer + контекст как управление государством. На экране отображаются герои, все работает нормально, но у меня появляется предупреждение Reach Hook useEffect has a missing dependency: 'setHeroes'
. Но если я добавлю его как зависимость, оно будет sh мое приложение с Maximum depth update exceeded
Я искал, но все, что я вижу, это помещает вызов функции fetch внутри useEffect()
. Я бы хотел извлечь функцию и поместить ее в отдельный файл в соответствии с принципом SRP
EDITED:
Как рекомендовано при использовании useCallback()
AppContext.js
const setHeroes = useCallback(() => {
getHeroes().then(result => dispatch({ type: SET_HEROES, heroes: result }))
}, [dispatch, getHeroes])
HeroesScreen.js
useEffect(() => {
setHeroes()
}, [setHeroes])
Добавление getHeroes
в качестве зависимости от useCallback
, линтер показывает ненужную зависимость