Сначала я хотел бы сказать, что у меня есть решение, но оно кажется нелепым и должен быть лучший способ. Так что я начну с моего нелепого решения.
У меня есть форма, которая показывает, на какой странице я нахожусь. Я хочу, чтобы пользователь мог войти на страницу и перейти на эту страницу при входе.
Мой компонент выглядит примерно так:
const BookPagination = (props) => {
const history = useHistory()
const { items, bookTitle, currentPageId } = props
const [currentPage, setCurrentPage] = useState(currentPageId)
const totalPages = items.length
const ENTER = 13
// items is just a bunch of arrays with info about each page (each of which have an id)
const handlePageInput = (e) => {
if (e.keyCode === ENTER) {
e.preventDefault()
history.push({
pathname: `/books/${bookTitle}/id/${items[currentPage - 1].id}` //page id's start @ 1
})
} else {
setCurrentPage(e.target.value)
}
}
return (
<div className={'.pageSelector'}>
<span>
<input type="number"
min="1"
max={totalPages}
value={currentPage}
onKeyDown={handlePageInput}
onChange={handlePageInput}
/>
of {totalPages}
</span>
</div>
)
}
export default BookPagination
Так что это работает ... Если у меня есть закладка на странице 20 Моби Дика, я могу перейти к /books/mobydick/id/20
, и форма будет начинаться с 20
в поле ввода и будет перемещать меня куда угодно (я исключил код для проверки границ).
Моя проблема:
Эта вещь отображается каждый раз, когда я изменяю ввод. Если я стираю 20, вставляю 19 и нажимаю ввод ... это 6 визуализаций
Initial
, 20->2
, 2->0
, 0->1
, 1->19
, render new page
Это потому, что мое состояние обновляется каждый раз ..
Это единственный способ понять, как начать с номера текущей страницы при загрузке страницы и отредактировать его ... другие попытки не позволили бы мне обновить значение, если я начал с одного ..
Как сделатьЯ исправляю это?
Я думаю, что я ищу React.createRef (), но я пробовал следующее:
Добавить value={currentPageId}
и ref={inputElement}
вформа
Добавить const inputElement = React.createRef()
в начало компонента
Удалить переменную состояния, currentPage
Редактировать handlePageInput
вследующее:
const handlePageInput = (e) => {
if (e.keyCode === ENTER) {
e.preventDefault()
history.push({
pathname: `/books/${bookTitle}/id/${items[inputElement.current.value - 1].id}`
})
} else {
inputElement.current.value = e.target.value
}
}
, но это не позволит мне стереть значение поля ввода ... щелчок вверх и вниз внутри поля ввода тоже ничего не делает. Если я вошел на страницу 200, я не могу изменить ее на любую другую страницу.
Используя этот метод,
, если я удалю value={currentPageId}
и оставлю форму без атрибута значения,
- с обновлением моего
history.push pathname
до .../id/${items[inputElement.current.valueAsNumber - 1].id}
Я могу войти на любую страницу и перейти по ней правильно ... моя проблема в том, что когда я захожу на страницу, в поле ввода ничего не запускается ... именно так я и обновлял ее с помощью useState()
, во-первых ...
Чего мне не хватает?