Я играю с реактивными хуками и наткнулся на камень преткновения с помощью редуктора.Я создал простой pinPad, в котором хранится контакт для состояния, затем я сравниваю его с константой и затем направляю на страницу входа, если 2 совпадают.(Я знаю, что это не слишком сложно!) Я использую useReducer, передавая редуктор:
function reducer(state, action) {
switch (action.type) {
case "addDigit":
return state + action.payload;
case "reset":
return "";
default:
throw new Error();
}
}
.На данный момент я не реализовал проверку PIN-кода, а вместо этого использую компонент для ссылки на страницу "/ LoggedIn".
const [state, dispatch] = useReducer(reducer, "");
затем:
<KeyDigit
digit={v}
key={v}
className="keyDigit number"
buttonAction={e =>
state.length < 4 && dispatch({ type: "addDigit", payload: e })
}
/>
однако, когда я связываюсь с "/ LoggedIn", я получаю сообщение "TypeError: buttonAction не является функцией", как будто отправка запускаетсяснова после рендеринга компонента.
Мой маршрутизатор:
<Router>
<div>
<Route exact path="/" component={App} />
<Route path="/LoggedIn" component={LoggedIn} />
</div>
</Router>
Я не знаю, почему все, что содержится в компоненте приложения, должно отправляться, когда я не выполняю рендеринг приложенияКомпонент, кстати, я могу вручную ввести URL-адрес «/ LoggedIn» и сообщение об ошибке не появляется, поэтому, похоже, что-то делать с маршрутизатором.
KeyDigit Component:
const KeyDigit = ({ digit, className, children, buttonAction }) => {
let id = `id-${digit}`;
return (
<div
className={className}
id={id}
onClick={e => {
buttonAction(digit);
}}
>
<svg
width="100%"
height="100%"
viewBox="0 0 141 141"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="70" cy="70" r="67" className="key keyNumber" />
</svg>
<span className="keyDigitNumber">{digit}</span>
<div className="keyDigitNumber">{children}</div>
</div>
);
};