Использование хука useReducer неправильно из-за того, что вы используете хук useReducer в своем компоненте, не означает, что вы обновляете состояние глобального контекста.
Так в вашем buttonbar.js
const [filter, dispatch] = useReducer(filterReducer, state);
const showAll = () => {
dispatch({ type: "SHOW_ALL" });
console.log("showAll clicked");
};
const showApproval = () => {
dispatch({ type: "SHOW_APPROVAL" });
console.log("showApproval clicked");
};
Вы корректно обновляете свое состояние, используя редуктор, но оно будет обновлять только состояние локального компонента, а не состояние глобального контекста.
Это может показаться нелогичным, если вы прибываете из редукса.
В контексте состояние содержится и изменяется в родительском компоненте, поэтому просто переместите вышеуказанный код в родительский компонент, а затем получите доступ к нему через контекст.
export function Provider({ children }) {
let intialState = {
polls: [],
dispatch: action => this.setState(state => filterReducer(state, action))
};
// 2 args not 3
const [state, setState] = useState(intialState);
const [filter, dispatch] = useReducer(filterReducer, state);
const showAll = () => {
dispatch({ type: "SHOW_ALL" });
console.log("showAll clicked");
};
const showApproval = () => {
dispatch({ type: "SHOW_APPROVAL" });
console.log("showApproval clicked");
};
передать состояние и функции в значение prop
<Context.Provider value={{
showAllProp: () => showAll(),
showApprovalProp: () => showApproval(),
filterProp: filter }}>
{children}
</Context.Provider>
Затем вы можете получить доступ к этим значениям и функциям в дочернем компоненте с помощью значения props.
const context = useContext(Context);
<button class="btn btn-primary btn-sm" name="all" onClick={context.showAllProp}>
All
</button>{" "}
<button
class="btn btn-primary btn-sm"
name="trump approval"
onClick={context.showApprovalProp}
>
По сути, это то, как вы связываете свой контекст с вашими компонентами.