#javascript #reactjs #use-reducer
Вопрос:
я попробовал этот шаблон включения функции диспетчеризации в свою функцию редуктора, но я получил это, независимо от того, что я пытаюсь увеличить или уменьшить, чего мне не хватает, в основном создание вспомогательного метода в моей функции редуктора для лучшего подхода к api может быть не лучшим подходом, но, по крайней мере, я пробовал по-другому, в чем проблема, которой мне не хватает, чтобы это работало [простите мой английский]
import * as React from 'react';
const CounterContext = React.createContext();
function CounterProvider({ step = 1, initialCount = 0, ...props }) {
const [state, dispatch] = React.useReducer(
(state, action) => {
const change = action.step ?? step
switch (action.type) {
case 'increment': {
return { ...state, count: state.count change }
}
case 'decrement': {
return { ...state, count: state.count - change }
}
default: {
throw new Error(`Unhandled action type:${action.type}`)
}
}
},
{ initialCount: initialCount })
const increment = React.useCallback(() => dispatch({ type: 'increment' }), [
dispatch
])
const decrement = React.useCallback(() => dispatch({ type: 'decrement' }), [
dispatch
])
const value = { increment, decrement, state }
return <CounterContext.Provider value={value} {...props} />
}
function useCounter() {
const context = React.useContext(CounterContext)
if (context === undefined) {
throw new Error('useCounter must be used within CounterProvider')
}
return context
}
function Counter() {
const { state, increment, decrement } = useCounter();
console.log(state, 'inc ', increment, 'dec ', decrement)
return (
<div>
<button onClick={decrement}>-</button>
<button onClick={increment}> </button>
<div>Current Count: {state.count}</div>
</div>
)
}
function App() {
return (
<CounterProvider>
<Counter />
</CounterProvider>
)
}
export default App
Ответ №1:
Потому что вы передаете initial
значение есть { initialCount: initialCount }
. Так что у тебя нет count
. Просто обновите до count
{ count: initialCount }
Ответ №2:
Это просто, вам просто нужно обновить свой { initialCount: начальный счет } для подсчета, чтобы получить значение.
Это должно выглядеть так { count: начальный счет }