vue-day07

发布时间 2023-09-27 19:35:58作者: Py玩家

vue-router使用

以后用组件的切换来实现页面切换效果,必须借助于vue-router来实现

vuex学过的:

<router-view/>,显示组件,位置在router/index.js中配置,提供的
<router-link :to="about_url">作业面跳转

基本使用

写一个页面组件
配置访问某个路径显示这个页面组件

路由跳转

html 中通过标签跳转

<router-link :to="about_url">
      <button>点我跳到about标签的跳转</button>
</router-link>
    
<router-link to="/about">
          <button>点我跳到about标签的跳转</button>
</router-link>

js 控制页面跳转

方式一:地址形式

this.$router.push('/about')

方式二:对象形式

this.$router.push({name: 'about'})#通过地址的别名
this.$router.push({path: '/about'})# 通过地址

相关api

this.$router.push(path): 相当于点击路由链接(可以返回到当前路由界面)
this.$router.replace(path): 用新路由替换当前路由(不可以返回到当前路由界面)
this.$router.back(): 请求(返回)上一个记录路由
this.$router.go(-1): 请求(返回)上一个记录路由
this.$router.go(1): 请求下一个记录路由

 页面跳转携带数据

方式一:?后携带数据

标签跳转

<router-link to="/userinfo?user_id=9">
<router-link :to="{name:userinfo,query:{user_id:88}}">

js 跳转

this.$router.push("/userinfo?user_id=9")
this.$router.push({name:userinfo,query:{user_id:88}})

取值:$route而不是router

this.$route.query.user_id

方法二:/xx/:id/:name

配置路由:

{

path: '/userinfo/:id/:name',
name: 'userinfo',
component: UserDetail

},

跳转的时候

标签跳转

<router-link to="/userinfo/88/lqz">
<router-link :to="{name:userinfo,params:{id:88,name:lqz}}">

js 跳转

this.$router.push("/userinfo/88/lqz")
this.$router.push({name:userinfo,params:{id:88,name:lqz}})

取值的时候:

this.$route.params.id

多级路由

新建一个首页HomeView,一个IndexView和OrderView

1.构建出骨架,以后想点击只要这个位置变,就放一个<router-view/>
2.IndexView和OrderView正常写

定义多级路由

 {
        path: '/',
        name: 'home',
        component: HomeView,
        children: [ //通过children配置子级路由
            {
                path: 'index', //此处一定不要写:/news
                component: IndexView
            },
            {
                path: 'order',//此处一定不要写:/message
                component: OrderView
            }
        ]
    },

 

路由跳转:js,html

路由守卫

作用:对路由进行权限控制

分类:全局守卫、独享守卫、组件内守卫

全局守卫

// 该文件专门用于创建整个应用的路由器(router下的index.js)
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建并暴露一个路由器
const router =  new VueRouter({
    routes:[
        {
            name:'guanyu',
            path:'/about',
            component:About,
            meta:{title:'关于'}
        },
        {
            name:'zhuye',
            path:'/home',
            component:Home,
            meta:{title:'主页'},
            children:[
                {
                    name:'xinwen',
                    path:'news',
                    component:News,
                    meta:{isAuth:true,title:'新闻'}
                },
                {
                    name:'xiaoxi',
                    path:'message',
                    component:Message,
                    meta:{isAuth:true,title:'消息'},
                    children:[
                        {
                            name:'xiangqing',
                            path:'detail',
                            component:Detail,
                            meta:{isAuth:true,title:'详情'},

                            //props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。
                            // props:{a:1,b:'hello'}

                            //props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。
                            // props:true

                            //props的第三种写法,值为函数
                            props($route){
                                return {
                                    id:$route.query.id,
                                    title:$route.query.title,
                                    a:1,
                                    b:'hello'
                                }
                            }

                        }
                    ]
                }
            ]
        }
    ]
})

//全局前置路由守卫————初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{
    console.log('前置路由守卫',to,from)
    if(to.meta.isAuth){ //判断是否需要鉴权
        if(localStorage.getItem('name')==='lqz'){
            next()
        }else{
            alert('名不对,无权限查看!')
        }
    }else{
        next()
    }
})

//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{
    console.log('后置路由守卫',to,from)
    document.title = to.meta.title || 'lqz系统'
})

export default router

独享守卫

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建并暴露一个路由器
const router =  new VueRouter({
    routes:[
        {
            name:'guanyu',
            path:'/about',
            component:About,
            meta:{title:'关于'}
        },
        {
            name:'zhuye',
            path:'/home',
            component:Home,
            meta:{title:'主页'},
            children:[
                {
                    name:'xinwen',
                    path:'news',
                    component:News,
                    meta:{isAuth:true,title:'新闻'}
                },
                {
                    name:'xiaoxi',
                    path:'message',
                    component:Message,
                    meta:{isAuth:true,title:'消息'},
                    children:[
                        {
                            name:'xiangqing',
                            path:'detail',
                            component:Detail,
                            meta:{isAuth:true,title:'详情'},

                            //props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。
                            // props:{a:1,b:'hello'}

                            //props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。
                            // props:true

                            //props的第三种写法,值为函数
                            props($route){
                                return {
                                    id:$route.query.id,
                                    title:$route.query.title,
                                    a:1,
                                    b:'hello'
                                }
                            }

                        }
                    ]
                }
            ]
        }
    ]
})

//全局前置路由守卫————初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{
    console.log('前置路由守卫',to,from)
    if(to.meta.isAuth){ //判断是否需要鉴权
        if(localStorage.getItem('name')==='lqz'){
            next()
        }else{
            alert('名不对,无权限查看!')
        }
    }else{
        next()
    }
})

//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{
    console.log('后置路由守卫',to,from)
    document.title = to.meta.title || 'lqz系统'
})

export default router

组件守卫

//进入守卫:通过路由规则,进入该组件时被调用
   beforeRouteEnter (to, from, next) {
   },
   //离开守卫:通过路由规则,离开该组件时被调用
   beforeRouteLeave (to, from, next) {
   }


    //通过路由规则,进入该组件时被调用
        beforeRouteEnter (to, from, next) {
            console.log('About--beforeRouteEnter',to,from)
            if(to.meta.isAuth){ //判断是否需要鉴权
                if(localStorage.getItem('school')==='atguigu'){
                    next()
                }else{
                    alert('学校名不对,无权限查看!')
                }
            }else{
                next()
            }
        },

        //通过路由规则,离开该组件时被调用
        beforeRouteLeave (to, from, next) {
            console.log('About--beforeRouteLeave',to,from)
            next()
        }

路由器的两种工作模式

1 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
2 hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
3 hash模式:
地址中永远带着#号,不美观 。
若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
兼容性较好。
4 history模式:
地址干净,美观 。
兼容性和hash模式相比略差。
应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题

localStorage系列

前端存储数据的地方

可以放到cookie中,cookie有过期时间,一旦过期就清理了
可以当到localStorage,永久存储,除非使用代码删除,清理浏览器
可以存到sessionStorage,关闭浏览器就没了

场景:不登录加购物车

作用:判断用户的登录状态(通过token)

localStorage

存:
    var obj = {"name":"xiaoming","age":"16"}
    localStorage.setItem("userInfo",JSON.stringify(obj));
取:
    var user = JSON.parse(localStorage.getItem("userInfo"))
删除:
    localStorage.remove("userInfo);
清空:
    localStorage.clear();

sessionStorage

savesessionStorage() {
     
      var userinfo = {'name': 'lqz', 'age': 19}
      sessionStorage.setItem('userinfo', JSON.stringify(userinfo))
    },
    getsessionStorage() {
      var res = JSON.parse(sessionStorage.getItem('userinfo'))
      console.log(res)
    },
    deletesessionStorage() {
      sessionStorage.clear()
      sessionStorage.removeItem('username')
    },

cookie

使用js-cookie工具:

1.npm i js-cookie //安装
2.import Cookies from 'js-cookie' //引用

// 存入cookie:
Cookies.set('token','value')

// 获取cookie:
Cookies.get('token')

//删除cookie:
Cookies.remove('token')

vue3的介绍

源码升级

使用Proxy代替defineProperty实现响应式

重写虚拟DOM的实现和Tree-Shaking

拥抱TypeScript

Vue3可以更好的支持TypeScript
兼容JavaScript

新的特性

Composition API(组合API)

    setup配置
    ref与reactive
    watch与watchEffect
    provide与inject
新的内置组件

    Fragment
    Teleport
    Suspense
其他改变

    新的生命周期钩子
  data 选项应始终被声明为一个函数
    移除keyCode支持作为 v-on 的修饰符

 

组合式api和配置项api

配置项api定义组件

export default {
        data(){
            name:ss
        }
        mehtods:{
            console.log(name)
        }
    }

组合式api定义组件