Хотя есть много
router
статьи по теме, ну и что, я просто хочу написать.
На самом деле в vuejs есть нечто, называемое динамическими компонентами.Эффект немного похож на роутинг.Разные компоненты выводятся в соответствии с требованиями.Однако в реальном использовании он очень скуп, что людям неудобно, и нет возможности программно навигация как маршрутизация (push
,replace
), нет семантического указания пути браузера, динамические компоненты больше подходят для небольших локальных вкладок и показывают волну использования.
<template>
<div>
ul>li>tab1+tab2 @click="" <!-- >>>此处改变下面data中的tab值就可以切换了 -->
<!-- 此处相当于router-link效果,虽然没有浏览器的url引导,但是可以自己写面包屑 -->
<component :is="tab"></component> <!-- 这里就是router-view显示区了 -->
</div>
</template>
<script>
import tab1 from 'path/to/tab1.vue' //相比vue-router要引入很多文件 麻烦
import tab2 from 'path/to/tab2.vue'
//其实vue-router也引入文件,但是在.vue文件里面引入那么多就很难看
export default {
data(){
tab:'tab1' //默认显示tab1
},
components:{
tab1,
tab2 //es6语法 对象中,键值相同可以这样写
}
}
</script>
Не будем о динамических компонентах, запустим роутер. Часто используемые API подробно описаны на официальном сайте. Не забудьте посмотреть официальное руководство, не забудьтеофициальный API
конфигурация маршрутизации
Независимо от того, какая конфигурация маршрутизации или конфигурация vuex и т. д., есть соответствующие спецификации.В обычных файлах js будет нехорошо, если они не будут следовать спецификациям.В файлах ts будет сообщение об ошибке. Предпосылка заключается в том, что вы заинтересованы в игре TS.
// router/index.js
// 此处省略一堆 import
const router = new Router({
base:'/',
mode:'history',//default-->hash
routes:[],
scrollBehavior:()=>{
return {x:0,y:0}
}
})
На самом деле конфигурация очень простая, вот и все.
base
Префикс URL-адреса браузера, по умолчанию'/'
, если установлено'/some/'
, затем запустите проект, URL-адрес браузера'/some/...'
, не повлияет на ссылку статических файлов. Как правило, веб-сайт будет иметь доменное имя, и вы можете указать доменное имя на каталог сервера, поэтому по умолчанию'/'
То есть, если вы пишете внутреннее фоновое управление компании, вы можете не использовать доменное имя, это может быть каталог под определенным ip, например, запакованный файл находится в111.22.33.44/admin
, в это время, когда конфигурация маршрута совпадает с путем браузера, он начнется с этого/admin
Начать отсчет, если база по-прежнему дефолтная/
, то конфигурация маршрутизацииroutes
изpath
добавить все/admin/
префикс иrouter-link
а такжеpush
метод также должен добавить это/admin
, очень хлопотно, но пока вы устанавливаетеbase
для'/admin/'
, внутренняя конфигурация маршрутизации и все связанные методы могут игнорировать имя каталога под IP-адресом сервера. В этом случае также настройтеwebpack
изpublicPath
также для/admin/
, я не буду вдаваться в подробности здесь.
mode
Это слишком просто, всего три режима,
hash
: браузер будет иметь символ «#», обратитесь к эффекту точки привязки, недостаток уродлив, но совместимость отличная
history
:уберите символ #, чтобы адрес выглядел лучше.Конфигурация сервера будет рассмотрена ниже.
abstract
: для небраузерных сред этот режим будет применяться, напримерweex
конфигурация сервера в режиме истории
Я использую и себя и свою компаниюnginx
, здесьnginx
, причина для настройки этогоКогда вы вводите маршрут и снова обновляете страницу (или когда браузер напрямую вводит путь маршрута), когда страница обновится, браузер повторно проанализирует протокол dns и tcp. В это время он отправится на сервер, чтобы найти соответствующие ресурсы в соответствии с URL-адресом браузера. Конечно, мыvue-router
Он обслуживает одну страницу. Соответствующий URL-адрес не должен иметь статических ресурсов на стороне сервера, и появится ошибка 404. Когда настроен следующий оператор перезаписи URL-адреса, обратите внимание на перезапись, а не на перенаправление.Переписать содержимое браузера без изменения URL, переписано наindex.html
,потому что этоindex.html
сделать точку входа в наш проект,index.html
Он будет читать упакованный в то времяapp.js
, вы можете прочитать конфигурацию маршрутизации, чтобы реализовать страницу маршрутизации, соответствующую URL нашего браузера.
hash
Режим не нужно настроить, так как браузер игнорирует # и? следующие параметры
Когда файл пакета находится в корневом каталоге,
location / {
try_files $uri $uri/ /index.html;
}
Когда файл пакета находится в некорневом каталоге,
location /admin {
try_files $uri $uri/ /admin/index.html;
}
routes
основная конфигурация маршрутизации,Официальный сайтЭто очень подробно, я расскажу о нескольких моментах, на которые следует обратить внимание, все пользовательские настройки, такие как требовать ли аутентификацию или соответствующую иконку и т. д., если они должны быть стандартизированы, написаны наmeta
в объекте,
Если она не стандартизирована иpath
Один уровень, просто играй, как вам нравится, я не буду винить, если она сломается.
path
необходимо указать,name
Нужно быть уникальным, не обязательно.
routes
Конфигурация следует за последовательным сопоставлением. Когда URL-адрес успешно сопоставлен, он больше не будет совпадать, поэтому что-то вроде403,404
страница должна быть написана последней.
alias
Использование псевдонимов, когда необходимо указатьrouter-view
Используйте при отображении компонента, и вы хотите, чтобы URL-адрес браузера соответствовал семантике, которую вы хотите
redirect
Перенаправление, параметр может быть путем или объектом (перенаправление на определенное имя), обратите внимание, что перенаправление заключается в изменении содержимого + изменение URL-адреса
scrollBehavior
Это поведение прокрутки, если честно, кажется очень хромым, я в основном никогда не использую его, он контролируетbodyсвиток, Многие требования включают частичную прокрутку. Если вам действительно нужно контролировать прокрутку тела, вы можете обратиться к официальной документации.
использование маршрутизации
Конфигурация маршрутизации начинается только с корневого каталога/
, напишите каждый слойchildren
написать слойrouter-view
, иначе компонент не отображается. каждое гнездоchildren
уровень иrouter-view
Уровни находятся во взаимно однозначном соответствии.
// router/index.js
const router = new Router({
routes:[
{
path:'/', //此时配置数组的第一层级,即对应app.vue中的router-view
component:Home,// <<<----------------------------
children:[// |
{ // |
//此时第一层级出现children第二层级,------------
//那么在这个第二层级所属的第一层级 Home组件中,就要写一层router-view,以此类推
path:'user',
component:User,
}
]
}
]
})
Конфигурация маршрутизации генерирует меню меню
Меню на самом деле является навигацией по маршруту, который является маршрутизатором-связью.Многие мелкие партнеры создают другой файл с именем menu.js, а затем моделируют структуру конфигурации маршрутизации для записи массива, а затем проходят для создания dom по этому файлу.feel, а при использовании сторонних компонентов меню ui таких статичных файлов нетусловие(Соответствующее меню текущего маршрута доступа будет выделено, и выделение будет потеряно при обновлении страницы или вводе URL-адреса маршрута для входа на страницу).
В меню много ситуаций,
- Фиксированный уровень, такой как фиксированный уровень 2 или уровень 3, в общих системах управления фоном существует множество фиксированных уровней, потому что это красиво и аккуратно. Это удобнее. Домовая структура шаблона также более удобна.
- «Персонализированные» продакт-менеджеры, «настраиваемые» меню-меню, неизвестные уровни, здесь для записи dom используется функция рендеринга.
Фиксированный уровень
<template>
<div class="menu">
<div class="first-menu" v-for="item,index in menus" :key="item.name">
<router-link :to="item.name">{{ item.meta.zhName }}</router-link>
<template v-if="item.children.length">
<div class="sub-menu" v-for="subItem.subIndex in item.children"
:key="subItem.name">
<img :src="subItem.meta.icon" />
<router-link :to="subItem.name">
{{subItem.meta.zhName}}
</router-link>
</div>
</template>
</div>
</div>
</template>
<script>
export default {
computed:{
menus(){
return this.$router.options.routes
//获取路由配置
}
}
}
</script>
<style>
.router-link-active{
/* 激活样式 */
}
</style>
Здесь я написал только 2 слоя, и не писал стили, если бы использовал что-то вродеelement-uiТакой компонент меню, его нижний слой не отображается какrouter-link
, затем программная навигация,click
когда,push
прибытьitem.name
, а стиль навигации по текущему маршруту должен основываться на$route.name(当前路由配置)
судить
Неизвестный уровень
Поскольку я не знаю, сколько слоев меню, html-теги в шаблоне не могут свободно перемещаться, поэтому js необходим для управления рекурсией конфигурации маршрутизации. с функцией рендеринга.
<script>
export default {
computed:{
menus(){
return this.$router.options.routes
//获取路由配置
}
},
// 使用render函数就不需要写template标签的dom了
render(h){
//这个 h 参数,原来的语义是createElement ,这里使用 h 是方便操作,也是官方建议
// ...... 这里是操作 menus 的递归代码,再通过render函数循环出来
return h('div','这是一个div')
//这里必须return 对应的语法
}
}
</script>
Синтаксис функции рендеринга см. в официальной документации.функция рендеринга.
Здесь есть оговорка, если
router
Сделайте контроль разрешений, тогда конфигурация маршрутизации не может пройти$router.options.routes
получить, потому чтоaddRoutes
Метод не изменяет исходную конфигурацию, она должна быть вaddRoutes
В то же время сохраните полную конфигурацию маршрутизации вvuex
, а затем получить. Контроль разрешений подробно не обсуждается.Есть много статей по теме,но копировать не рекомендуется.Рекомендуется добавить свое понимание.Абсолютного решения нет.
Маршрутизируемое кэширование и анимация перехода
Следует использовать анимацию перехода, обычно используемуюopacity
Переход.
<template>
<transition mode="out-in" name="fade">
<!-- 这里如果在行内直接用$route.meta去v-if判断缓存 dom结构会变复杂 -->
<keep-alive :include="aliveRoutes">
<router-view :key="$route.fullPath" />
<!-- 此处通过路由的完整路径加上key,当为动态路由时,触发路由组件重新渲染 -->
</keep-alive>
</transition>
<!-- 都是些官方用法 不细说了-->
</template>
<script>
export default {
computed:{
aliveRoutes(){
// this.$router.options.routes 获取路由配置
//可以配置meta 是否缓存 根据 meta 字段 push到数组里
return [/* ... */]
}
}
}
</script>
крючок маршрутизации
Официальный сайт очень подробный. Последовательность срабатывания также уточняется, официальное заявление называетсянавигационная охрана.
Примечание. Чтобы выяснить, что является глобальным хуком, а что хуком в компоненте. И все pre-hooks, нужно вызвать next(), чтобы нормально войти в маршрут, при написании функции-хука нужно обратить внимание, нельзя формировать мертвый цикл
Например
router.beforeEach((to,from,next)=>{
if (from.name === 'login'){
next({
name:'login' //死循环
})
//更多next回调方法可以查看官方文档
}
})
Использование хуков в компонентах зависит от бизнес-требований, таких как динамическая маршрутизация ↓↓↓.
динамическая маршрутизация
Динамическая маршрутизация, сценарий использования представляет собой фиксированный компонент представления маршрутизации с динамическим URL-адресом браузера для отображения различных данных в представлении и надеждой, что URL-адрес имеет семантику текущих сведений, таких как страница сведений, страница информации о пользователе.
Давайте сначала посмотрим, как настроить динамическую маршрутизацию, вот пример страницы сведений
// router/index.js
const router = new Router({
routes:[
{
path:'/list',
name:'list',
component:List
},
{
path:'/detail/:id',//此处id对应params.id
name:'detail',
component:Detail
}
]
})
<!-- List.vue -->
<template>
<div>
<ul>
<li @click="goDetail(item.id)" v-for="item in someData" :key="item.id">
</li>
</ul>
</div>
</template>
<script>
export default{
methods:{
goDetail(_id){
this.$router.push({
name:'detail',
//此处注意只有通过name跳转路由,params才会生效
//query不受影响
params:{
id:_id //此处对应routes配置的/:id
}
})
}
}
}
</script>
<!-- Detail.vue -->
<script>
export default {
beforeRouteEnter (to, from, next) {
//此处为路由组件内的钩子,可以通过判断 to.params.id 是否 undefined,
//进行一些操作,因为即使 to.params.id 是 undefined,路由也能匹配成功
//因为这些id可能是用来获取数据的,不会在页面显示,不一定能察觉是 undefined
}
}
</script>
О параметрах маршрутизации
-
params
Как указано выше, разговора динамической маршрутизации, только через конфигурацию маршрутизацииname
Перейти, это вступит в силу, даже если динамическая маршрутизация не используется, вы можете пройтиparams
передать параметры
Вот несколько замечаний:
-
Если вы используете динамическую маршрутизацию, обновите маршрут на странице динамической маршрутизации,
params
параметры все еще существуют, -
Если динамическая маршрутизация не используется,
params
Параметр действителен только при переходе по маршруту и будет потерян при обновлении страницы.params
-
query
параметры, которые могут бытьpath
илиname
Переходы могут передавать параметры, и параметры будут объединены сajax
изget
Так же, как и запрос, он прикрепляется к URL-адресу браузера, а страница обновляется и сохраняется.
ленивая загрузка маршрутов
Компонент роутинга упаковывает отдельные js, при обращении к роуту загружается соответствующий js файл, чтобы ускорить время загрузки домашней страницы и увеличить общий размер проекта.
-
npm
илиyarn
Установитьbabel-plugin-syntax-dynamic-import
-
.babelrc
илиbabel.config.js
настроить
module.exports = {
plugins:["syntax-dynamic-import"]
}
- использование файла маршрута
// router/index.js
const router = new Router({
routes:[
{
path:'/list',
name:'list',
component:()=>import(/* webpackChunkName:"SOME_NAME" */'path/to/List.vue')
//此处 import 是方法 和 es6 的 import 不一样
//特殊注释语法 相同chunkName 打包到一个js中 可省略
}
]
})
Именованные представления для маршрутов
Я никогда не использовал именованные представления, поэтому я не буду вводить вас в заблуждение, все, что я могу объяснить, это то, что именованные представления функционируют как URL-адрес браузера, соответствующий несколькимrouter-view
. При необходимости переместите официальную документацию.
часть API
-
.vue
в файлеthis.$router
Относится к смонтированному экземпляру маршрутизации, который можно использоватьpush
и другие методы. -
.vue
в файлеthis.$route
Текущий информационный объект маршрутизации, включаяpath
,query
и т. д., свойства только для чтения. -
router.app
Ссылаться наrouter
Установленныйvue
экземпляр, который может бытьrouter.app.$options.store
доступvuex
, при условии, чтоmain.js
В середине вы должны представить сначалаvuex
, после введенияrouter
, иначе будет сообщено об ошибке. -
router.push()
Общий метод перехода маршрутизации, параметры{path?:string,name?:string,params?:object,query?:object}
, должны знать,push
это имя метода, не связанное с массивом. -
router.replace()
заменить текущий маршрут, параметры иpush
Последовательно, разница в том, что текущий маршрут заменяется, то есть нажатие возврата браузера не приведет к возврату к ранее замененному маршруту. -
router.go()
а такжеrouter.back()
, аргумент является целым числом, на несколько шагов вперед или назад. -
router.addRoutes()
параметры должны соответствоватьroutes
Данные конфигурации, динамическое добавление конфигурации маршрутизации к исходной конфигурации.
конец
Если у вас есть какие-либо вопросы или вы ошиблись, вы можете задать
Советы: если вы знаете, как делиться, вы можете пойти дальше.