Функции: useRouter | Next.js
Если вы хотите получить доступ к объекту router
внутри любого функционального компонента в вашем приложении, вы можете использовать хук useRouter
, взгляните на следующий пример:
import { useRouter } from 'next/ маршрутизатор функция ActiveLink ({ дочерние элементы, href }) { постоянный маршрутизатор = useRouter() постоянный стиль = { полеПраво: 10, цвет: router.asPath === href ? «красный»: «черный», } const handleClick = (e) => { e.preventDefault() router.push(href) } возвращаться ( {дети} ) } экспорт ActiveLink 9 по умолчанию0009
useRouter
— это React Hook, то есть его нельзя использовать с классами. Вы можете либо использовать withRouter, либо обернуть свой класс в функциональный компонент.Ниже приведено определение объекта router , возвращенного как
, так и
useRouter withRouter
:
-
pathname
:String
- Путь для текущего файла маршрута, следующего за/pages
. Следовательно,basePath
,языковой стандарт
и косая черта (trailingSlash: true
) не включены. -
запрос
:Объект
— Строка запроса преобразована в объект, включая параметры динамического маршрута. Это будет пустой объект во время предварительного рендеринга, если страница не использует рендеринг на стороне сервера. По умолчанию{}
-
asPath
:String
— Путь, отображаемый в браузере, включая параметры поиска и с учетом завершающей косой черты 9Конфигурация 0004.basePath
иязыковой стандарт
не включены. -
isFallback
:логическое значение
— находится ли текущая страница в резервном режиме. -
basePath
:Строка
— активный basePath (если включен). -
языковой стандарт
:Строка
— активный языковой стандарт (если включен). -
локали
:String[]
— Все поддерживаемые локали (если включены). -
по умолчаниюЯзык
String
— Текущая локаль по умолчанию (если включена). -
domainLocales
:Array<{domain, defaultLocale, locales}>
— любые настроенные локали домена. -
isReady
:boolean
— Обновляются ли поля маршрутизатора на стороне клиента и готовы ли к использованию. Следует использовать только внутри методовuseEffect
, а не для условного рендеринга на сервере. См. соответствующие документы для примера использования с автоматически статически оптимизированными страницами -
isPreview
:boolean
— находится ли приложение в данный момент в режиме предварительного просмотра.
Использование поля
asPath
может привести к несоответствию между клиентом и сервером, если страница визуализируется с использованием рендеринга на стороне сервера или автоматической статической оптимизации. Не используйтеasPath
до тех пор, пока полеisReady
не станет равнымtrue
.
Следующие методы включены в маршрутизатор
:
router.push
Примеры- Использование маршрутизатора
Обрабатывает переходы на стороне клиента. Этот метод полезен в случаях, когда
недостаточно.
router.push(url, as, options)
-
url
:UrlObject | Строка
— URL-адрес для перехода (см. документацию модуля URL-адреса Node.JS для свойствUrlObject
). -
как
:UrlObject | Строка
— необязательный декоратор для пути, который будет отображаться в адресной строке браузера. До Next.js 9.5.3 это использовалось для динамических маршрутов. -
опции
- Дополнительный объект со следующими опциями конфигурации:-
scroll
— необязательное логическое значение, управляет прокруткой вверх страницы после навигации.правда
-
мелкий
: обновить путь к текущей странице без повторного запускаgetStaticProps
,getServerSideProps
илиgetInitialProps
. По умолчаниюложь
-
локаль
— необязательная строка, указывает локаль новой страницы
-
Вам не нужно использовать
router.push
для внешних URL-адресов. window.location лучше подходит для таких случаев.
Переход к pages/about.js
, который является предопределенным маршрутом:
import { useRouter } from 'next/router' функция экспорта по умолчанию Page() { постоянный маршрутизатор = useRouter() возвращаться (
Навигация по страницам/post/[pid].js
, который является динамическим маршрутом:
import { useRouter } from 'next/router' функция экспорта по умолчанию Page() { постоянный маршрутизатор = useRouter() возвращаться (
Перенаправление пользователя на
, полезно для страниц за аутентификацией:
import {useEffect} from 'react' импортировать {useRouter} из 'следующего/маршрутизатора' // Здесь вы должны получить и вернуть пользователя const useUser = () => ({пользователь: null, загрузка: false}) функция экспорта по умолчанию Page() { const {пользователь, загрузка} = useUser() постоянный маршрутизатор = useRouter() использоватьЭффект(() => { если (!(пользователь || загрузка)) { router.push('/логин') } }, [пользователь, загрузка]) вернутьПеренаправление...
}
Сброс состояния после навигации
При переходе на ту же страницу в Next.js состояние страницы
импортировать ссылку из 'далее/ссылка' импортировать {useState} из «реагировать» импортировать {useRouter} из 'следующего/маршрутизатора' функция экспорта по умолчанию Страница (реквизит) { постоянный маршрутизатор = useRouter() const [количество, setCount] = useState (0) возвращаться ( <дел>Страница: {router.
query.slug}Количество: {count}
один два
В приведенном выше примере переход между
и /два
не приведет к сбросу счетчика. useState
сохраняется между рендерингами, потому что компонент React верхнего уровня, Page
, один и тот же.
Если вы не хотите такого поведения, у вас есть несколько вариантов:
Вручную убедитесь, что каждое состояние обновляется с помощью
.useEffect
. В приведенном выше примере это может выглядеть так:useEffect(() => { установитьКоличество (0) }, [router.query.slug])
Используйте ключ React
импорт {useRouter} из «следующего/маршрутизатора» функция экспорта по умолчанию MyApp({ Component, pageProps }) { постоянный маршрутизатор = useRouter() return <Ключ компонента={router.asPath} {...pageProps} /> }
С объектом URL
Вы можете использовать объект URL так же, как вы можете использовать его для next/link
. Работает как для url
и как параметры
:
import {useRouter} from 'next/router' функция экспорта по умолчанию ReadMore({ post }) { постоянный маршрутизатор = useRouter() возвращаться ( <кнопка тип = "кнопка" onClick={() =>{ маршрутизатор.push({ путь: '/post/[pid]', запрос: {pid: post.id}, }) }} > Нажми сюда, чтобы прочитать больше кнопка> ) }
router.replace
Аналогично replace
prop in next/link
, router. replace
предотвратит добавление новой записи URL в стек истории
.
router.replace(url, as, options)
- API для
router.replace
точно такой же, как API дляrouter.push
.
Взгляните на следующий пример:
import { useRouter } from 'next/router' функция экспорта по умолчанию Page() { постоянный маршрутизатор = useRouter() возвращаться (
router.prefetch
Предварительная выборка страниц для более быстрого перехода на стороне клиента. Этот метод полезен только для навигации без next/link
, так как next/link
автоматически обеспечивает предварительную загрузку страниц.
Это функция только для производства. Next.js не выполняет предварительную выборку страниц в разработке.
router. prefetch(url, as, options)
-
url
— URL-адрес для предварительной выборки, включая явные маршруты (например,/dashboard
) и динамические маршруты (например,/product/[id]
) -
как
— Дополнительный декоратор дляURL
. До Next.js 9.5.3 это использовалось для предварительной выборки динамических маршрутов. -
options
- Необязательный объект со следующими разрешенными полями:-
локаль
- позволяет указать локаль, отличную от активной. Еслиfalse
,url
должен включать локаль, так как активная локаль не будет использоваться.
-
Допустим, у вас есть страница входа, и после входа вы перенаправляете пользователя на панель инструментов. В этом случае мы можем предварительно загрузить панель мониторинга, чтобы сделать переход более быстрым, как в следующем примере:
import { useCallback, useEffect } from 'react' импортировать {useRouter} из 'следующего/маршрутизатора' функция экспорта по умолчанию Login() { постоянный маршрутизатор = useRouter() const handleSubmit = useCallback((e) => { e. preventDefault() fetch('/api/логин', { метод: «ПОСТ», заголовки: {'Content-Type': 'application/json'}, тело: JSON.stringify({ /* Данные формы */ }), }).then((рез) => { // Делаем быстрый переход на стороне клиента к уже загруженной странице панели if (res.ok) router.push('/dashboard') }) }, []) использоватьЭффект(() => { // Предварительная выборка страницы панели инструментов router.prefetch('/приборная панель') }, [маршрутизатор]) возвращаться ( <форма onSubmit={handleSubmit}> {/* Поля формы */} форма> ) }
router.beforePopState
В некоторых случаях (например, при использовании пользовательского сервера) вы можете захотеть прослушать всплывающее состояние и сделать что-то до того, как маршрутизатор отреагирует на него.
router.beforePopState(cb)
-
cb
— функция, запускаемая при входящих событияхpopstate
. Функция получает состояние события в виде объекта со следующими реквизитами:-
url
:String
- маршрут для нового состояния. Обычно это имястр.
-
как
:Строка
- URL-адрес, который будет отображаться в браузере -
параметры
:Объект
- Дополнительные параметры, отправленные router.push
-
Если cb
возвращает false
, маршрутизатор Next.js не будет обрабатывать popstate
, и в этом случае ответственность за его обработку лежит на вас. См. Отключение маршрутизации файловой системы.
Вы можете использовать beforePopState
для управления запросом или принудительного обновления SSR, как в следующем примере:
импорт {useEffect} из «реагировать» импортировать {useRouter} из 'следующего/маршрутизатора' функция экспорта по умолчанию Page() { постоянный маршрутизатор = useRouter() использоватьЭффект(() => { router. beforePopState(({ url, as, options }) => { // Я хочу разрешить только эти два маршрута! если (как !== '/' && как !== '/другое') { // Пусть SSR отображает плохие маршруты как 404. window.location.href = как вернуть ложь } вернуть истину }) }, [маршрутизатор]) вернутьсяДобро пожаловать на страницу
}
router.back
Перейти назад в истории. Эквивалентно нажатию кнопки «Назад» в браузере. Он выполняет window.history.back()
.
импорт {useRouter} из 'следующего/маршрутизатора' функция экспорта по умолчанию Page() { постоянный маршрутизатор = useRouter() возвращаться (
router.reload
Обновить текущий URL-адрес. Эквивалентно нажатию кнопки обновления в браузере. Он выполняет window.location.reload()
.
импорт {useRouter} из 'следующего/маршрутизатора' функция экспорта по умолчанию Page() { постоянный маршрутизатор = useRouter() возвращаться (
router.events
Примеры- С индикатором загрузки страницы
Вы можете прослушивать различные события, происходящие внутри маршрутизатора Next.js. Вот список поддерживаемых событий:
-
routeChangeStart(url, {мелкий})
— срабатывает, когда маршрут начинает меняться -
routeChangeComplete(url, {мелкий})
— срабатывает при полном изменении маршрута -
routeChangeError(err, url, {mellow})
— срабатывает при ошибке при изменении маршрута или отмене загрузки маршрута-
err.cancelled
— Указывает, была ли навигация отменена
-
-
beforeHistoryChange(url, {мелко})
- Срабатывает перед изменением истории браузера -
hashChangeStart(url, {мелкий})
— срабатывает, когда изменится хэш, но не страница -
hashChangeComplete(url, {мелкий})
— срабатывает, когда изменился хеш, но не страница
Полезно знать : здесь
url
— это URL-адрес, отображаемый в браузере, включаяbasePath
.
Например, для прослушивания события маршрутизатора routeChangeStart
, откройте или создайте pages/_app.js
и подпишитесь на событие, например:
import {useEffect} from 'react' импортировать {useRouter} из 'следующего/маршрутизатора' функция экспорта по умолчанию MyApp({ Component, pageProps }) { постоянный маршрутизатор = useRouter() использоватьЭффект(() => { const handleRouteChange = (url, {мелко}) => { console.log( `Приложение меняется на ${url} ${ мелкий ? 'с' : 'без' } неглубокая маршрутизация` ) } router.events.on('routeChangeStart', handleRouteChange) // Если компонент размонтирован, отписаться // из события методом `off`: возврат () => { router.events.off('routeChangeStart', handleRouteChange) } }, [маршрутизатор]) вернуть <Компонент {...pageProps} /> }
В этом примере мы используем пользовательское приложение (
pages/_app. js
), чтобы подписаться на событие, потому что оно не отключается при навигации по страницам, но вы можете подписаться на события маршрутизатора в любом компоненте вашего приложения.
События маршрутизатора должны регистрироваться при монтировании компонента (useEffect или componentDidMount / componentWillUnmount) или в обязательном порядке при возникновении события.
Если загрузка маршрута отменена (например, путем быстрого последовательного нажатия двух ссылок), routeChangeError
сработает. И переданный err
будет содержать свойство canceled
, установленное на true
, как в следующем примере:
import { useEffect } from 'react' импортировать {useRouter} из 'следующего/маршрутизатора' функция экспорта по умолчанию MyApp({ Component, pageProps }) { постоянный маршрутизатор = useRouter() использоватьЭффект(() => { const handleRouteChangeError = (ошибка, URL) => { если (ошибка отменена) { console. log(`Маршрут к ${url} был отменен!`) } } router.events.on('routeChangeError', handleRouteChangeError) // Если компонент размонтирован, отписаться // из события методом `off`: возврат () => { router.events.off('routeChangeError', handleRouteChangeError) } }, [маршрутизатор]) вернуть <Компонент {...pageProps} /> }
Некоторые методы, доступные на объекте маршрутизатора , возвращают обещание. Если у вас включено правило ESLint без плавающих обещаний, подумайте об отключении его либо глобально, либо для затронутой строки.
Если вашему приложению требуется это правило, вы должны либо аннулировать
промис, либо использовать асинхронную
функцию, ожидание
промиса, а затем аннулировать вызов функции. Это неприменимо, когда метод вызывается из onClick
обработчик .
Затронутые методы:
-
router.push
-
маршрутизатор. заменить
-
router.prefetch
Возможные решения
import {useEffect} из 'React' импортировать {useRouter} из 'следующего/маршрутизатора' // Здесь вы должны получить и вернуть пользователя const useUser = () => ({пользователь: null, загрузка: false}) функция экспорта по умолчанию Page() { const {пользователь, загрузка} = useUser() постоянный маршрутизатор = useRouter() использоватьЭффект(() => { // отключить линтинг на следующей строке — это самое чистое решение // eslint-disable-next-line без плавающих обещаний router.push('/логин') // аннулировать промис, возвращенный router.push если (!(пользователь || загрузка)) { недействительным router.push('/логин') } // или используйте асинхронную функцию, ждите промиса, затем аннулируйте вызов функции асинхронная функция handleRouteChange() { если (!(пользователь || загрузка)) { ожидайте router.push('/логин') } } недействительный дескрипторRouteChange() }, [пользователь, загрузка]) вернутьПеренаправление. ..
}
Если useRouter
вам не подходит, withRouter
также может добавить тот же объект router
к любому компоненту.
Использование
import { withRouter } from 'next/router' функция Страница({маршрутизатор}) { вернуть{router.pathname}
} export default withRouter(Page)
TypeScript
Чтобы использовать компоненты класса с withRouter
, компонент должен принять поддержку маршрутизатора:
import React from 'react' импортировать {withRouter, NextRouter} из 'следующего/маршрутизатора' интерфейс WithRouterProps { маршрутизатор: NextRouter } интерфейс MyComponentProps расширяет WithRouterProps {} класс MyComponent расширяет React.Component{ оказывать() { вернуть {this.props.router.pathname}
} } экспорт по умолчанию с маршрутизатором (MyComponent)
Проблемы с перенаправлением на новую страницу с помощью window.
location.href Проблемы с перенаправлением на новую страницу с помощью window.location.hrefБольшинство ответов, связанных с вашими вопросами
codeigniter
- Функция вызова в контроллере из маршрутов
- $_REQUEST не работает в codeigniter
- Изменение стиля значка в соответствии со статусом
- Класс проверки сборки Codeigniter для ваших нужд
- 403 Запрещено У вас нет прав доступа к /mytesting/< на этом сервере. ОШИБКА
- извлечь значения их типа из result_array()
- Маршрутизация Codeigniter
- Нормализация, список категорий и воспламенитель кода
- Как использовать таблицу сеансов в зажигателе кода
- Codeigniter: как передать несколько входных данных с несколькими одинаковыми именами?
joomla
- Как сделать так, чтобы элементы цикла foreach отображались более чем в одном столбце?
- Перенаправление административного компонента Joomla не работает?
- Плагин Joomla для запуска другого кода, если пользователь вошел в систему
- Что означает #__ в начале имени таблицы в запросе Joomla mysql?
- Тип формы пользовательского поля не требуется для сохранения в Joomla 2. 5
- странный класс с вложенным {} (PHP)
- почему слайдер не работает с этим плагином G+ Feed?
- Как ускорить загрузку сайта Joomla+VirtueMart?
- Изменение темы Joomla
- Создать пользовательский модуль с javascript и загрузить javascript в нижний колонтитул
laravel
- Laravel Blade как использовать оператор if для нулевого или пустого
- Laravel 4 Eloquent возвращает неправильный идентификатор
- Как абстрактный класс Model в laravel обрабатывает вызовы статических динамических методов, таких как «::find()», «::where()» и т. д.
- Вызов функции-члена createToken() при нулевом значении?
- Область запроса Laravel 5. 2 для полиморфных отношений
- Laravel: отправка данных контроллеру через AJAX без формы
- Как получить список всех сеансов сервера в laravel?
- laravel 5.4: отправка электронной почты с локального хоста не работает
- не удалось загрузить поток cafile: `C:\xampp\apache\bin\curl-ca-bundle.crt'
- Множественный приоритет оператора WHERE() в Laravel
счет:0
На самом деле вы ничего не отправляете, поэтому просто используйте тег кнопки и избавьтесь от возвращаемого значения. Onclick должен быть только location="something".
<кнопка> Иди развлекайся кнопка>
Подробнее Ответить
- Страница Php (SF2) не обновляется с новым кодом
- Как открыть новое окно с target='_blank' ? Мой код не работает
- Перенаправление на новую страницу с сохранением исходного местоположения
- Открыть новую страницу и выполнить javascript в той же ссылке href
- Передача $_FILES или $_POST на новую страницу с PHP
- Проблемы с часовым поясом при новой установке XAMPP с PHP 5. 3
- перенаправление на новую страницу с почтовыми данными в Javascript
- Как перенаправить URL-адрес старого сайта, который заканчивается на .html, на домашнюю страницу нового сайта
- Расположение заголовка IE8 Php открывает новое окно
- nginx: загрузить страницу 404, если местоположение не совпадает с заданным URL-адресом
- Копирование html-страницы с помощью fopen и проверка новой страницы для поиска переменных сеанса
- Мой вызов header() не перенаправляет на новую страницу
- как создать PDF-файл с серией изображений, каждое из которых напечатано на новой странице, в один файл с помощью FPDF
- Содержание TCPDF и проблемы с номерами страниц
- Перенаправить категорию и все ее публикации на новый URL-адрес с помощью . htaccess
- Граница вокруг страницы в PDF с MPDF
- Опубликовать на странице Facebook с помощью PHP в качестве администратора страницы
- Носитель страницы Typo3 (изображения) отсутствует после переноса на новый хост
- переименование файла с помощью jquery и php из модального окна
- Проблемы с меню аккордеона с использованием jquery и PHP для отображения «активных» ссылок и сохранения ползунка меню открытым на текущей странице
- Отправка формы с расположением перенаправления, отличным от действия
- Фильтрация результатов из БД с помощью Javascript, которая заставит DIV перезагрузить свое содержимое на основе новых аргументов
- Новый массив из двух других массивов с одним общим ключом. Есть советы по оптимизации?
- Общий хостинг и создание страниц с PHP
- Проблемы сеанса PHP с SAFARI
- Загрузить страницу с html/js с помощью AJAX
- Как я могу перенаправить на страницу с паролем, но доступ к странице через URL невозможен?
- Таблица стилей CSS не соединяется с моей целевой страницей HTML (не была загружена, поскольку ее тип MIME, «текст/html», не является «текст/css»)
- Как опубликовать новый ответ на вопрос с помощью Google My Business API в PHP
- Настройка обложки и последней страницы с mPDF
- Отображение значений таблицы на странице Pdf с помощью TCPDF
- загрузчик typeahead не работает с динамическими данными со страницы php
- Проблемы с нежадным совпадением
- Как автоматически входить в систему нового пользователя после регистрации в пользовательском провайдере в Silex?
- prestashop-создать новую форму с помощью ajax onclick
- Приложение Facebook успешно публикует информацию на странице, но сообщения не видны тем, кто не является разработчиком. Мне действительно нужно проверять приложение с 1 пользователем?
- Vagrant VM с приложением laravel 4, права доступа к файлу mkdir() запрещены для новых папок и подкаталогов
- Сохранение данных HABTM при одновременном создании новой записи в связанной таблице с помощью CakePHP
- Jquery Post/AJAX — влияет ли закрытие окна с кодом на сценарий сервера?
- Как получить реферер, платный/естественный и ключевые слова для текущего посетителя в PHP с новым Google Analytics?
- Отправить форму с помощью тега привязки, чтобы открыть PDF-файл в новом окне
- использовать htaccess для предотвращения вызова страницы, за исключением RewriteRule
- Удаленное обновление статуса страницы с помощью PHP
- Как использовать $. post для включения в запрос новой страницы
- DDD Корень агрегата, как создать новые дочерние элементы агрегата с разными типами? Заводской метод?
- Как создать страницу с двумя формами в Symfony?
- Selenium с проблемами браузера PHP Firefox
- Получить полный URL-адрес страницы, используя php с номером порта и https
- Обработка действия по удалению базы данных на той же странице PHP с сообщением
- как установить тайм-аут для загрузки страницы в Mink с драйвером Selenium 2?
Больше ответов с тем же ag
- Доступ оболочки к сценариям PHP на локальном хосте?
- password_verify Всегда возвращает False, даже если используются правильные переменные
- Использовать два объекта с одинаковыми именами в symfony
- Идентификация и визуализация роботов
- «Подделка» (= имитация) запроса на удаленное взаимодействие AMFPHP
- PHP — динамически расширять родительский класс с помощью статических методов
- strtotime("следующий март")
- Многомерный массив PHP — подсчет дубликатов и смешивание дубликатов с оригиналом
- Почему файлы cookie отправляются только на http://www. example.com, а НЕ на http://example.com?
- PHP-Downloadscript - ограничение загрузки не работает
- загружать только текстовые файлы
- PHP | Рассчитать оставшиеся дни, но с учетом високосных лет
- Как возможна такая проблема: целое является нечисловым?
- Symfony/VichUploaderBundle: удалить сущность
- Неверный аргумент PHP указан в foreach
- Используйте DomDocument для замены всех тегов заголовков на теги h5
- Как использовать JWT SSO/автоматический вход в HumHub
- Как сопоставить требуемые символы в случайном порядке с помощью регулярного выражения?
- чтение нескольких файлов CSV
- laravel 8 не запускает файл миграции в папке пакетов
- Динамическое изменение содержимого вкладки
- htaccess, если изображение не найдено, перейдите в другое место
- PHP: регулярное выражение для сопоставления каждой строки
- num_rows с подготовленным оператором возвращает 0 строк, когда эквивалентный нормальный запрос возвращает больше
- Больше нельзя выполнить миграцию в Symfony с помощью ocramius/proxy-manager при миграции?
- Проблема с передачей параметров с android на php
- Форма электронной почты PHP — включить локально
- JSONP и GET с обратными вызовами — нужна помощь в исправлении ошибок
- Загрузка файлов и обеспечение их безопасности
- preg_match(): Неизвестная функция модификатора php
- Symfony 2. 8 с базой данных Oracle — слишком длинный идентификатор
- Ajax Multiarray возвращает
- Как установить лимит памяти и время ожидания выполнения для определенного IP-адреса с помощью php-fpm и nginx?
- Чем отличаются эти два добавления массива?
- Zend Engine возвращает ссылку на объект
- отладка move_uploaded_file в cakephp
- Найти и заменить с помощью QueryPath
- Установить групповые политики для Windows — активный каталог из PHP
- Цикл сценария оболочки из PHP не работает
- Как создать uuid с 8 или 16 символами с помощью php?
- Получение переменных отображается при перезаписи подкаталога, mod_rewrite
- Codeception — невозможно сохранить и загрузить снимок сеанса в Firefox
- Как отправить текущий URL-адрес с помощью ajax без перенаправления?
- Символ UTF-8 в имени файла, URL-адрес ссылки возвращает ошибку 404
- Как отобразить единицу измерения продукта на внешнем интерфейсе (веб-сайте) в Magento?
- переменная пропускная способность через пагинацию лезвия
- Рассчитать час и оплатить
- Laravel 5: загружается ли Eloquent по умолчанию?
- Скрипт загрузки PHP не работает при вызове через AJAX
- Запуск SQLite 3 в MicroApache
Источник: stackoverflow.