#reactjs #react-router #react-hooks
#reactjs #реагировать-маршрутизатор #реагирующие хуки
Вопрос:
Я играю с перехватчиками react и столкнулся с камнем преткновения с useReducer. Я создал простую PINPad, которая сохраняет pin-код для состояния, затем сравнивает его с константой, а затем перенаправляет на страницу входа в систему, если 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 amp;amp; 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:
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>
);
};
Комментарии:
1. Было бы полезно, если бы вы могли предоставить CodeSandbox , который воспроизводит эту проблему. Как минимум, пожалуйста, покажите код для
LoggedIn
компонента и код, который отображает ссылку для перехода к/LoggedIn
.
Ответ №1:
Вам нужно предотвратить событие во время загрузки компонента
<KeyDigit
digit={v}
key={v}
className="keyDigit number"
buttonAction={e => {
e.preventDefault();
state.length < 4 amp;amp; dispatch({ type: "addDigit", payload: e })
}}
/>
поскольку вы используете exact
/
path, даже если вы находитесь на http://localhost:3000
он загрузит компонент приложения, поэтому вместо /
использования /home
тогда вы сможете загрузить его только на http://localhost:3000/home
Комментарии:
1. Не могу заставить это работать, ошибка появляется только при перенаправлении на следующую страницу.
2. можете ли вы добавить код для компонента KeyDigit для исследования
3. Конечно, спасибо за ваше время, я отредактировал исходное сообщение.
4. <div className={className} id={id} onClick={e => { e.preventDefault(); buttonAction(цифра); }} >
5. можете ли вы внести вышеуказанные изменения, которые могли бы помочь