vue路由基础

路由基础

  • 用路由代替组件的使用

路由安装

npm i vue-router

基本使用

在main.js中

// 引入VueRouter
import VueRouter from 'vue-router';
// 全局使用路由
Vue.use(VueRouter);

//创建组件
//引入组件
import home from './components/home.vue';
import login from './components/login'
import register from './components/register'

// 实例化路由,并配置路径
let router = VueRouter({
    routes: [
        { path: '/home', component: home },
        { path: '/login', component: login },
        { path: '/register', component: register },
        { path: '*', redirect: '/home' } //重定向
    ]
});

new Vue({
    render: h => h(App),
//把路由实例化对象放在Vue的实例上
    router
}).$mount('#app')

app.vue

<template>
  <div id="app">
    <!--  app.vue中放置 router-view组件,路由出口 -->
    <router-view></router-view>
  </div>
</template>

路由重定向

{ path:'*',redirect:'/home' },//重定向

路由模式(mode)

下载时选项

将路径映射到组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a5HknffT-1637320198282)(C:/Users/Administrator/Desktop/%E8%AF%BE%E5%A0%82%E7%AC%94%E8%AE%B0/%E7%AC%AC%E5%9B%9B%E9%98%B6%E6%AE%B5/%E7%AC%94%E8%AE%B0/assets/1636614308998.png)]

history: 选n地址栏会出现#号,y无#号

设置模式mode

const router = new VueRouter({
  //路由规则
  routes,
  //history 不带# ,hash是带#
  mode:"history"
})
  • 开发环境下,hash和history没有区别
  • hash和history的区别是在生产环境下:上线
    hash 
      1.前进 后退 刷新ok
      "http://localhost:3000/#/login"  "#/login"是hash值,hash的改变不会影响请求
      2.采用的是window.onhashchange=()=>{}实现的

    history 
      1.前进 后退ok 刷新(404,数据)
      一旦刷新,就是get请求是真实的路由,那么就走了后端路由,如果后端有这个路由,直接数据展示,如果后端没有该路由,会404
      2.采用HTML5新增的interface 里面的pushState() replaceState()
      3.工作的时候如果要用history,需要后端配合

https://router.vuejs.org/zh/guide/essentials/history-mode.html#后端配置例子

导航

登录、购物车、分类、列表页

  • 页面级的组件放在pages目录下,公共组件(不做为页面)放在components。

跳转组件(router-link)

  • 必须加 to属性,要跳转的路径地址
      <router-link to="/detail">小米10</router-link> | 
      <router-link to="/list">手机</router-link>

高亮路由导航链接

  • 当路由和router-link上的 to地址一致时,则当前的router-link上会自动加上router-link-active 类名,使元素高亮。类似a标签,并且在页面中会解析成a标签。
.footer .router-link-active{
  background: pink;
  color: white;
}

自定义高亮类名

active-class等于class.

<footer class="footer">
  	<router-link to="/index/home" active-class="active">首页</router-link>
      <router-link to="/index/cates"  active-class="active">分类</router-link>
      <router-link to="/index/cart"  active-class="active">购物车</router-link>
      <router-link to="/index/my"  active-class="active">我的</router-link>
</footer>
.footer .active{
  background: pink;
  color: white;
}

编程式导航

编程式导航即使用js的方式跳转

编程导航

this.$router.push('path') //添加了一条新的历史记录 router-link默认就是push
this.$router.replace('path') //用新的记录替换当前历史记录
this.$router.go(-1) //返回之前页面

vue 跳转:

 <!-- 编程式导航跳转 -->
<button @click="goLogin">跳转到我的</button>
<button @click="$router.push('/index/my')">跳转到我的</button>
 goLogin(){
      let username = 'adf'
      if( username == '' ){
        alert('请输入用户名')
        return
      }
      //判断成功了,跳转到我的页面
       this.$router.push('/index/my')
    }
 <!-- push应用场景 1. 淘宝app首页  2. 点击搜索   3. 搜索列表页   4. 点击某个商品进入详情页 -->
    <h2> push-添加一条历史记录并跳转</h2>
    <button @click="$router.push('/search')">跳转到搜索页</button>

<!-- repalce应用场景 5. 加入购物车 6. 下单 7确认订单 8提交订单并支付  9 replace跳转到订单详情页 -->
    <h2> replace 不保留历史记录</h2>
    <button @click="$router.replace('/search')">跳转到搜索页</button>
 <button @click="$router.go(-1)">返回</button>
<!--如-2则退两个页面,但如使用replace跳转来的则不计入。-->
 <button @click="$router.go(-2)">返回</button>

嵌套路由[二级路由]

const router = new VueRouter({
  routes:[
    // 第1层的配置就是一级路由
    { path:'/list',component:list },
    { path:'/login',component:login },
    { path:'/detail',component:detail },
    { 
      path:'/index',  //称为大首页
      component:index,
        //二级路由,path不需要加 '/'
      children:[ 
        { path:'cart',component:cart },
        { path:'home',component:home },
        { path:'my',component:my },
      //{ path:'*',redirect:"/index/home" }, //如果二级路由写 * 那么重定向地址要写全
        { path:'',redirect:"home" }
    },
    {
      path:'*',
      redirect:'/index'
    }
  ]
})

注意:

在 index组件(一级路由)的页面里 ,必须在加 router-view 这个出口

封装

封装过滤器

formatter.js

let formatter = (e,type)=>{
}
export default formatter

filters/index.js

import Vue from 'vue'

import priceToFixed from './price.js'
import formatter from './formatter.js'

// Vue.filter('priceToFixed',priceToFixed)
// Vue.filter('formatter',formatter)

let filters = {
    priceToFixed,
    formatter
}

for(let key in filters){
    Vue.filter(key,filters[key])
}

main.js

// 引入一下过滤器的封装和优化
import './filters/index.js'

封装全局组件

按照之前全局组件的语法封装了两个组件,返回/搜索

原则上要保证main.js干净。

在components下创建index.js

import Vue from 'vue'

//设置一个全局组件
import searchBtn from './searchBtn'
import goBack from './goBack'

// Vue.component( 'searchBtn',searchBtn )
// Vue.component( 'goBack',goBack )
let coms = {
    searchBtn,
    goBack
}

for(let key in coms){
    Vue.component( key,coms[key] )
}

再在main.js中引入即可

// 引入一下全局组件文件即可
import './components/index.js'

静态资源

字体图标

先下载图标,把整体放到assets文件夹下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMMQUwl1-1637320198285)(C:/Users/Administrator/Desktop/%E8%AF%BE%E5%A0%82%E7%AC%94%E8%AE%B0/%E7%AC%AC%E5%9B%9B%E9%98%B6%E6%AE%B5/bj_803_4/day07/%E7%AC%94%E8%AE%B0/assets/1636683640768.png)]

在main.js中引入iconfont.css。

//字体样式
import './assets/iconfont/iconfont.css'

在组件中使用字体图标。

assets/public

组件中使用assets下的资源使用相对路径

组件中使用public下的资源使用 ‘ / ’ 开头,并且不包含public

<h2>assets</h2>
<img src="../../assets/erha2.jpg" class="img" alt="">
<h2>public-</h2>
<img src="/images/erha1.jpg" class="img"  alt="">

样式

reset.css 重置样式的。

rem.js / rem的配置

如果设计是 750,那么就把这些改成750

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EDwxQI8L-1637320198287)(assets/1636620221664.png)]

安装 px to rem的vscode插件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ly26hKbM-1637320198292)(assets/1636620273446.png)]

c下的资源使用 ‘ / ’ 开头,并且不包含public

<h2>assets</h2>
<img src="../../assets/erha2.jpg" class="img" alt="">
<h2>public-</h2>
<img src="/images/erha1.jpg" class="img"  alt="">

样式

reset.css 重置样式的。

rem.js / rem的配置

如果设计是 750,那么就把这些改成750

[外链图片转存中…(img-EDwxQI8L-1637320198287)]

安装 px to rem的vscode插件

[外链图片转存中…(img-Ly26hKbM-1637320198292)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yq93hHBg-1637320198294)(assets/1636620355714.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值