首页 > 其他分享 >vue-day07

vue-day07

时间:2023-09-27 19:47:20浏览次数:33  
标签:vue name title day07 path 组件 router 路由

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定义组件

setup{
        var name =ss
        console.log(name)
    }

标签:vue,name,title,day07,path,组件,router,路由
From: https://www.cnblogs.com/shanghaipudong/p/17733047.html

相关文章

  • 基于vue封装的Tag标签双击编辑单击选中可删除
    ......
  • 记录--Vue3 + Fabricjs 定制国庆专属头像
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助生在国旗下,长在春风里!国庆将至,采黎为大家带来定制头像2.0(国庆头像),让我们用代码的形式为祖国庆生!欢迎大家点赞收藏加关注哦前言想看效果或者想定制春节头像的小伙伴请直奔效果区域;想一睹定制头像2.0小工具的......
  • vue3项目结合antdesignvue封装form表单及校验
    效果图 完整代码1<scriptsetup>2import{defineProps,onMounted,reactive,ref,defineEmits}from'vue'3import{Card,Input,Select,DatePicker,FormItem,Form,Button}from'ant-design-vue'4import{useRuleChe......
  • vue3项目table表格动态表头生成+行数据合并
    这两处地方是动态的,由后端数据返回思路流程  1,后端返回数据二次处理  2,根据后端数据生成动态表头  3,利用antd的customRender与rowSpan设置行合并 完整代码<template><Table:data-source="dataSource":columns="columns":pagination="......
  • Vue3 - provide 提供的异步数据 inject 得到的数据 undefined 或 null
    如下所示,父组件(祖先组件)通过provide函数向所有后代组件传递prop。但是这两个Ref类型的数据最开始没有,需要等到onMounted初始化之后才有值。此时会遇到两个问题后代组件在setup函数中或者onBeforeMount等非常周期中调用,可能获取的是undefined或者null。传递响应式......
  • vue,用户可操作权限判断,数据创建人判断
    需求:需要判断登录用户是否有对应的操作权限,有则显示对应的操作入口。判断某物的创建人是否为当前用户,是则可进行删除或修改操作。  调用以下函数。userId为当前登录的用户id;   ......
  • vue3项目封装支持搜索,选中不可选,选中的数据项支持上下移动,删除的上下穿梭的树状穿梭框
     1,vue3代码1//这个是返回的所有的数据2constsourceItems=ref([])3//这是穿梭到下面的数据4consttargetItems=ref([])5//这是搜索字段6constsearchName=ref('')7//这两个要是后端返回,可不写8constex......
  • vue中的this.$emit方法
    作用:用于子组件中触发父组件方法并传值使用://子组件中<template><button@click="handleChildEvent">子组件中触发的事件</button></template><script>exportdefault{name:'ChildComponent',methods:{handleChildEven......
  • vue中的forceUpdate方法
    适用场景:如果要改变data中的对象或者数组,会发现data数据改变了,但是页面上并没有更新如:this.list[index].sex='男';此时要想更新可以使用this.$set(this.list[index],'sex','男')也可以使用this.list[index].sex='男';this.$forceUpdate();//用来强制刷新页面缺点......
  • vue3项目结合ant design vue的upLoad组件实现上传和下载Excel文件
    1.上传文件  1.组件引入    import{ Button, Upload}from'ant-design-vue'  2.代码    <Upload      v-model:file-list="fileList"      name="file"      //限制文件格式      acce......