#javascript #reactjs #react-router #jsx
#javascript #reactjs #react-маршрутизатор #jsx
Вопрос:
Я использую маршрутизатор React. Я хочу, чтобы, когда пользователь нажимает на кнопку, он перенаправлял их на страницу (конечную точку) / форму, в которой есть компонент UserForm.
Вот мой код, обертывающий кнопку:
<Router>
<Link to="/form" className="updateLink">
<button className="updateBtn" onClick={() => {
this.update(id);
console.log(`Item Number: ${id} Was Updated Successfully`);
window.alert(`Item Number: ${id} Was Updated Successfully`);
}}>U</button>
</Link>
<Switch>
<Router exact path="/form" component={UserForm} />
</Switch>
</Router>
Комментарии:
1. Кнопки не должны использоваться для навигации. Оформите якорь в виде кнопки, если хотите, но это неправильное использование элемента и проблема доступности.
2. @isherwood Мне любопытно, хотя я и согласен с вами, как вы справляетесь с этим, если вам приходится одновременно предпринимать действия и перемещаться? Я не знаю, как справиться с этим случаем без кнопки или чего-то подобного
3. Чего ожидает пользователь от происходящего? Совершенно очевидно, что навигация по странице формы является основной функцией элемента.
Ответ №1:
Таким образом, причина, по которой это не работает, заключается в том, что Кнопка имеет свой собственный обработчик кликов, отдельный от обработчика ссылок. У вас есть два доступных вам варианта:
- Оформите тег ссылки так, чтобы он выглядел как кнопка, но на самом деле не был похож на кнопку (это не сработает, если вам нужно выполнить дополнительную логику в дополнение к маршрутизации).
- На самом деле используйте кнопку. А затем используйте ‘useHistory’ React Hook, который предоставляет React Router, чтобы получить функциональность, которую вы ищете.
Компонент будет выглядеть примерно так:
const history = useHistory()
return (
<Button onClick={() => history.push("/abc")}/>
)
Я бы лично рекомендовал вам просто оформить тег ссылки так, как вам нужно. Поскольку это было бы более доступно и понятно пользователю. Но это хорошая идея, только если вы заботитесь только о маршрутизации.
Ответ №2:
Является ли приведенный выше код точным, как в вашем коде?
Оператор маршрутизатора должен быть настроен, как показано ниже, обычно в App.js
<Router>
<Switch>
<Route path = './form' component = {form}
</Switch>
</Router>
Затем вы создаете компонент формы и для создания ссылки на него импортируете компонент ссылки в компонент, который вы хотите использовать.
Затем используйте, как показано ниже
<Link to = './form'> Some Text </Link>
К проблеме с кнопкой, с которой вы столкнулись
Он будет отображаться, но вы не должны вставлять <a>
<button>
тег or в HTML, так как он не будет семантическим для программ чтения с экрана, недоступен и не является допустимым HTML.
Элемент Link в react создает и отображает <a>
тег, который не должен быть вложен в кнопку.
Вы могли бы использовать useHistory в вашем случае для того же эффекта
import React from 'react'
import { useHistory } from 'react-router-dom'
const component = () => {
const { push } = useHistory()
...
<button
type="button"
onClick={() => push('/form')}>
Click me to go to a form!
</button>
...
}