Я следовал руководству по передаче редуктора дочерним компонентам с помощью useContext, но при диспетчеризации от дочернего компонента он, похоже, не перерисовывал родительский компонент.
Само состояниеКажется, корректно обновляется при отправке из дочернего компонента (как сделано console.logging state.count), но родительский компонент не отражает изменения в состоянии.
Я попытался передать функцию диспетчеризациикак опора для ребенка, и это обновляло App.js, но я думал, что мой подход был чище, и вместо этого я мог сделать что-то не так.Я также поместил {state.count}
в Child.js, и он обновился должным образом, но для этой ситуации он мне нужен в родительском компоненте.Вот код:
App.js
import React, { useReducer } from 'react';
import { StateProvider } from './reducer';
import Child from './Child'
function App() {
const reducer = (state, action) => {
switch (action.type) {
case 'add':
console.log(state.count+1)
return {...state, count: state.count + 1}
default:
throw new Error();
}
}
const initialState = {count: 1};
const [state, dispatch] = useReducer(reducer, initialState)
return (
<StateProvider initialState={initialState} reducer={reducer}>
<div className="App">
{state.count}
<Child></Child>
</div>
</StateProvider>
);
}
export default App;
reducer.js
import React, {createContext, useContext, useReducer} from 'react';
export const StateContext = createContext(null);
export const StateProvider = ({reducer, initialState, children}) => (
<StateContext.Provider value={useReducer(reducer, initialState)}>
{children}
</StateContext.Provider>
);
export const useStateValue = () => useContext(StateContext);
Child.js
import React from 'react';
import { useStateValue } from './reducer';
export default function Child(props) {
const [state, dispatch] = useStateValue();
return (
<button onClick={() => dispatch({type: 'add'})}>Increment</button>
)
}