欢迎光临散文网 会员登陆 & 注册

vue二级路由,传参,#,全局或局部路由访问,安装SASS,手机效果,.staging@诗书画唱

2021-05-22 23:25 作者:诗书画唱  | 我要投稿


本期又是干货满满的一篇专栏,写这种专栏,真的十分花时间,今天我就是中午一吃完饭后开始写这篇专栏,写到23:00左右。我的作品最近都没有上很多推荐,求大家等等点赞,投币,收藏(也就是“三连”)等等,让我获得更多的推荐!让我至少有些微薄的收益,谢谢大家的支持!



目录:

例子1:实现二级路由

个人认为App.vue中的<router-view/>就是与router文件夹中index.js配置路由(访问路径)中有关的一级路由,npm run dev运行后,这个<router-view/>会根据一级路由访问路径的不同变成对应的访问路径的组件。

个人理解:当你在router文件夹中index.js配置一级路由后,如果访问对应的访问路径后切换到一个组件,导航条<tabbar/>部分不变,再点击这个组件的切换组件的超链接等等,再访问的路径一般是二级路由的访问路径

设置二级路由时要用children这个数组,同时设置二级路由是有2种方法的,如下图所示

也可以再加<router-view/>,在children数组的path路径中再加个“/vue组件文件名前缀”,这样就可以设置三级路由,更多级的路由可以依次类推

用redirect重定向实现,访问某个一级路由的访问路径时,默认"跳转"(切换组件)到某个二级路由的访问路径的方法

个人理解<li v-for="data in dataList"  :key="data">{{data}}</li>的意思其实是把dataList遍历出dataList.length个数据动态变量data ,同时生成dataList.length个以动态变量data为文本内容的<li></li>. :key="data"是 v-bind:key="data"的缩写,是动态绑定地设置key。


个人理解:用this.$router.push('/(router文件夹中路由配置的path的内容,一般我习惯是设置为首字母大写或小写的要切换到的组件名)‘)实现触发绑定的点击事件后,触发的methods中的有页面跳转功能的viewDatail函数。


如果想实现传参,可以把点击事件触发的函数viewDetail()改写成viewDetail(data),这样触发点击事件时,也会传参。同时viewDetail()里面的this.$router.push('/XXX‘)可以改写成用了模板字符串的this.$router.push(`/XXX/${对应的传的参数名}`)


获取地址栏中传过来的参数名的内容,其实也很简单,我前面的专栏中讲过,用动态传参,即用{{$route.params.n}}(n是自定义的,n是在router文件夹中设置路由的path的内容中的’detail/:n'的n)



当然了,{{$route.params.n}}是在写HTML代码的<template></template>中写的,但是在

写js代码的export default中的mouted等自己想用的方法中可以通过this.$route.params.n的方式获取到地址栏传过来的参数的内容。


个人认为:呃,其实还有种传参的方法就是路由配置的name属性传参,其实和上面的动态传参差不多,就是写发不同,无非就是把模板字符串的this.$router.push(`/XXX/${对应的传的参数名}`)改写成了this.$router.push({name:'dl',params:{n:name,id:1}})等等,name:'dl‘要在对应的路由配置中写上可以传多个参数,更方便,我一般习惯用这种方法传参,前面我写的专栏中应该讲过,忘了的读者可以看我前面的专栏,并且给我个三连。



如果访问路径中有#,是因为我们在router文件夹中的index.js文件中的routes中没有声明mode:history,

就会默认产生mode:hash(hash就是符号#的意思),你在routes中声明mode:history,输入访问路径时就不会出现#(我个人习惯不去除#,#就是区分请求路径的,有时可以防止404界面的出现,如果说你声明mode:history,美化了访问路径,但访问路径若是不存在,可能真的访问其后台路径等等,那么就容易报404,这样不美观。一般如果访问一个不存在的路径时,会跳转我们设置的一个美观的提示该路径不存在的页面。如果可能出现404,且如果你是前端工程师等等,就要和负责后台的人员商量,设置一个当访问一个不存在的路径时,会跳转到的美观的提示该路径不存在的页面


hash


个人理解:下面是实现全局路由守卫的简单例子,其实我认为全局路由守卫类似于Java中的

全局的过滤器等等,全局路由守卫等的代码是在我们访问某个路径时会先执行的代码,可以实现的功能为:若你想访问个人中心界面,那么访问个人中心路径前会先执行全局路由守卫的代码,判断你是否登录了,发现你没有登录就用next('/XXX')之类强制让你跳转到登录界面等等(个人理解:next('/XXX')中的XXX就是router文件夹中的路由设置中的对应组件的path对应的值(或说是path对应的内容))。如果你登录了,那么就允许你访问个人中心界面。to.path就是你要访问的界面的路径。beforeEach也是钩子函数。


在下图中的实现点击个人中心的超链接时会跳转到登录界面(当然,这里的if判断等等内容要根据自己的需求,自己加上)的局部路由访问的例子中用到了beforeRouterEnter,beforeRouterEnter也是钩子函数。


代码


基本代码见https://www.bilibili.com/read/cv11382966我是以此文中的文件的代码为基础来写的代码,下面我只展示我做了改动或新增了的文件的代码部分。


Comingsoon.vue

Nowplaying.vue

Center.vue

Film.vue

Login.vue



例子2:vue中的SASS的安装(有时要注意cmd命令下载SASS,要用@指定适当的SASS版本的问题等等)




例子1:实现二级路由










第一阶段

"1、npm run lint命令:

如果config/index.js文件中的useEslint被设置为true,那么在编译时会报eslint错误

修改package.json文件中的""lint""为 ""eslint --fix --ext .js,.vue src"",

运行npm run lint,会自动修复所有的eslint错误

那么再执行npm run dev时就不会报错了"

"2、npm run build打包命令:

会自动生成dist文件,将dist文件夹中的内容部署到后台程序中"

"3、配置反向代理

修改config/index.js文件中的proxyTable属性

pathRewrite的作用"

4、创建导航栏

5、配置欢迎页面

6、高亮显示

7、二级路由配置

8、路由传参和name属性传参

9、去掉路径的#

10、路由守卫:全局路由守卫和局部路由守卫


第二阶段

"1、添加sass支持:--verbose显示安装的详细信息

npm install sass-loader@7.3.1 --save-dev

npm install node-sass@4.14.1 --save-dev

在build文件夹下的webpack.base.conf.js的rules里面添加配置:

{

        test: /\.scss$/,

        loaders: ['style', 'css', 'sass']

      }"

"2、选项卡沉底:App.vue中添加全局样式,Tabbar.vue中添加局部样式,

iconfont方式添加图片:

将所有图片文件放在assets/iconfont文件夹下

在main.js文件中导入图片文件

import './assets/iconfont/iconfont.css'

"

3、显示请求数据(特殊处理设置请求头获取数据和反向代理)

4、过滤处理数据Vue.filter

"5、轮播效果:

不要下载最新版本的swiper,否则分页栏和自动播放无效

npm install swiper@5.4.5 --save"

注意:如果反向代理不可用了,可尝试清除一下浏览器的缓存历史记录







个人认为App.vue中的<router-view/>就是与router文件夹中index.js配置路由(访问路径)中有关的一级路由,npm run dev运行后,这个<router-view/>会根据一级路由访问路径的不同变成对应的访问路径的组件。

个人理解:当你在router文件夹中index.js配置一级路由后,如果访问对应的访问路径后切换到一个组件,导航条<tabbar/>部分不变,再点击这个组件的切换组件的超链接等等,再访问的路径一般是二级路由的访问路径


设置二级路由时要用children这个数组,同时设置二级路由是有2种方法的,如下图所示


也可以再加<router-view/>,在children数组的path路径中再加个“/vue组件文件名前缀”,这样就可以设置三级路由,更多级的路由可以依次类推


用redirect重定向实现,访问某个一级路由的访问路径时,默认"跳转"(切换组件)到某个二级路由的访问路径的方法



个人理解<li v-for="data in dataList"  :key="data">{{data}}</li>的意思其实是把dataList遍历出dataList.length个数据动态变量data ,同时生成dataList.length个以动态变量data为文本内容的<li></li>. :key="data"是 v-bind:key="data"的缩写,是动态绑定地设置key。


当然这里的遍历电影列表最好写在”正在热映“Nowplaying.vue的组件中


个人理解:用this.$router.push('/(router文件夹中路由配置的path的内容,一般我习惯是设置为首字母大写或小写的要切换到的组件名)‘)实现触发绑定的点击事件后,触发的methods中的有页面跳转功能的viewDatail函数。


如果想实现传参,可以把点击事件触发的函数viewDetail()改写成viewDetail(data),这样触发点击事件时,也会传参。同时viewDetail()里面的this.$router.push('/XXX‘)可以改写成用了模板字符串的this.$router.push(`/XXX/${对应的传的参数名}`)


获取地址栏中传过来的参数名的内容,其实也很简单,我前面的专栏中讲过,用动态传参,即用{{$route.params.n}}(n是自定义的,n是在router文件夹中设置路由的path的内容中的’detail/:n'的n)

当然了,{{$route.params.n}}是在写HTML代码的<template></template>中写的,但是在

写js代码的export default中的mouted等自己想用的方法中可以通过this.$route.params.n的方式获取到地址栏传过来的参数的内容。

个人认为:呃,其实还有种传参的方法就是路由配置的name属性传参,其实和上面的动态传参差不多,就是写发不同,无非就是把模板字符串的this.$router.push(`/XXX/${对应的传的参数名}`)改写成了this.$router.push({name:'dl',params:{n:name,id:1}})等等,name:'dl‘要在对应的路由配置中写上可以传多个参数,更方便,我一般习惯用这种方法传参,前面我写的专栏中应该讲过,忘了的读者可以看我前面的专栏,并且给我个三连。




如果访问路径中有#,是因为我们在router文件夹中的index.js文件中的routes中没有声明mode:history,

就会默认产生mode:hash(hash就是符号#的意思),你在routes中声明mode:history,输入访问路径时就不会出现#(我个人习惯不去除#,#就是区分请求路径的,有时可以防止404界面的出现,如果说你声明mode:history,美化了访问路径,但访问路径若是不存在,可能真的访问其后台路径等等,那么就容易报404,这样不美观。一般如果访问一个不存在的路径时,会跳转我们设置的一个美观的提示该路径不存在的页面。如果可能出现404,且如果你是前端工程师等等,就要和负责后台的人员商量,设置一个当访问一个不存在的路径时,会跳转到的美观的提示该路径不存在的页面


hash

音译:哈许



个人理解:下面是实现全局路由守卫的简单例子,其实我认为全局路由守卫类似于Java中的

全局的过滤器等等,全局路由守卫等的代码是在我们访问某个路径时会先执行的代码,可以实现的功能为:若你想访问个人中心界面,那么访问个人中心路径前会先执行全局路由守卫的代码,判断你是否登录了,发现你没有登录就用next('/XXX')之类强制让你跳转到登录界面等等(个人理解:next('/XXX')中的XXX就是router文件夹中的路由设置中的对应组件的path对应的值(或说是path对应的内容))。如果你登录了,那么就允许你访问个人中心界面。to.path就是你要访问的界面的路径。beforeEach也是钩子函数。

这里的if判断中,记得center前加个/(图中少写了/)

在下图中的实现点击个人中心的超链接时会跳转到登录界面(当然,这里的if判断等等内容要根据自己的需求,自己加上)的局部路由访问的例子中用到了beforeRouterEnter,beforeRouterEnter也是钩子函数。


代码:

所需的基本的文件的代码


基本代码见https://www.bilibili.com/read/cv11382966我是以此文中的文件的代码为基础来写的代码,下面我只展示我做了改动或新增了的文件的代码部分。


index.js

import Vue from 'vue'

import Router from 'vue-router'

import HelloWorld from '@/components/HelloWorld'

//自己加的代码 START

// import ZuJian1 from '@/components/ZuJian1'

import My from '@/components/My'

import You from '@/components/You'


import Film from '@/views/Film'

import Cinema from '@/views/Cinema'

import Center from '@/views/Center'

import Detail from '@/views/Detail'

import Nowplaying from '@/views/Film/Nowplaying'

import Comingsoon from '@/views/Film/Comingsoon'

import Login from '@/views/Login'

//自己加的代码 END

Vue.use(Router)


const router = new Router({

  // export default new Router({

  routes: [

    {

      path: '/',

      name: 'HelloWorld',

      component: HelloWorld

    },


    // // http://localhost:8080/#/ZuJian1

    // {

    //   path: '/ZuJian1',

    //   name: 'ZuJian1',

    //   component: ZuJian1

    // }

    // http://localhost:8080/#/my

    {

      path: '/my',

      name: 'My',

      component: My

    },

    // http://localhost:8080/#/you

    {

      path: '/you',

      name: 'You',

      component: You

    },

    {

      path: '/film',

      component: Film,


      children: [// 二级路由:

        // http://localhost:8080/#/film/nowplaying

        {

          path: '/film/nowplaying',//——>也可以写成path: 'nowplaying'

          component: Nowplaying

        },

        {

          path: '/film/comingsoon',//——>也可以写成path: 'comingsoon'

          component: Comingsoon

        },

        {

          path: '',


          redirect: '/film/nowplaying'

          //——>设置二级路由为空时访问哪个组件,这里设置为nowplaying组件


        }

      ]

    }, {// http://localhost:8080/#/cinema

      path: '/cinema',

      component: Cinema

    }, {// http://localhost:8080/#/center

      path: '/center',

      component: Center

    }, {

      //动态传参相关 START

      path: '/detail/:n',

       //动态传参相关 END

      //name属性传参相关 START

      name: 'dl',

       //name属性传参相关 END

      component: Detail

    },

    {

      path: '/login',

      component: Login

    },

    

    {// 输入不匹配的路径是统一跳转到/film对应的组件

      path: '*',

      redirect: '/film'

    },

    


  ]

})


// 全局路由守卫实现安全验证 START

// router.beforeEach((to, from, next) => {

//   if (to.path === '/center') {

//     console.log('进行安全验证')

//     // 如果验证成功,就允许跳转到center页面去

//     // next();

//     // 如果验证不成功,就强制跳转到登录页面

//     next('/login')

//   } else {

//     next()

//   }

// })


// 全局路由守卫实现安全验证 END


/*路由配置等中都要export default new Router

等等,当这里我用const router = new Router封装了 new Router,

其实也是进行字面量的定义,后面方便用router.beforeEach等等,实现

全局路由守卫的安全验证......

但export default在结尾仍然不可以少*/

export default router




Comingsoon.vue


<template>

  <h1>即将上映</h1>

</template>


<script>

export default {


}

</script>


<style>


</style>




Nowplaying.vue

<template>

  <div>

    <h1>正在热映</h1>

    <ul>

      <li v-for="data in dataList" :key="data" @click="viewDetail(data)">

        {{ data }}

      </li>

    </ul>

  </div>

</template>


<script>

export default {

  data() {

    return {

      dataList: ["唐人街探案1", "悬崖之上", "唐伯虎点秋香"],

    };

  },

  methods: {

    viewDetail(name) {

      // console.log('显示' + name + '的详情')


      // 配置路由动态绑定的相关内容 START

      // this.$router.push(`/detail/${name}`)

      // 配置路由动态绑定的相关内容 END


      // 路由配置的name属性传参的相关内容 START

      this.$router.push({

        name: "dl",

        params: {

          n: name,

        },

      });

      // 路由配置的name属性传参的相关内容 END

    },

  },

};

</script>


<style>

</style>



Center.vue

<template>

  <h1>个人中心</h1>

</template>


<script>

export default {

  // 局部路由守卫(有三个钩子函数) START

  beforeRouteEnter (to, from, next) {

    // 这个方法中不能使用this关键字

    console.log('安全验证')

    // 允许访问

    // next()

    // 强制跳转到登录页面

    next('/login')

  }

}

 // 局部路由守卫(有三个钩子函数) END

</script>


<style>


</style>


Film.vue



<template>

  <div>

    <h1>电影LOGO</h1>

     <!-- <div>电影Tab</div> -->

    <router-view />

  </div>

</template>


<script>

export default {


}

</script>


<style>


</style>



Login.vue

<template>

  <h1>登录页面</h1>

</template>


<script>

export default {


}

</script>


<style>


</style>


运行

http://localhost:8080/#/film/nowplaying



例子2:vue中的SASS的安装(有时要注意cmd命令下载SASS,要用@指定适当的SASS版本的问题等等)




npm install sass-loader@7.3.1 --save-dev

npm install node-sass@4.14.1 --save-dev





在build目录下的webpack.base.conf.js中的

 module中的rules里面写上如下的代码:

{
        test: /\.scss$/,
        loaders: ['style', 'css', 'sass']
      }




.staging


通常一个web项目都需要一个staging环境,一来给客户做演示,二来可以作为production server的一个“预演”,正式发布新功能前能及早发现问题(特别是gem的依赖问题,环境问题等)。


staging server可以理解为production环境的镜像, QA在staging server上对新版本做最后一轮verification, 通过后才能deploy到产品线上. 有点网讯SERCM流程里面的SDA验证用的环境, 尽最大可能来模拟产品线上的环境(硬件,网络拓扑结构,数据库数据)


vue二级路由,传参,#,全局或局部路由访问,安装SASS,手机效果,.staging@诗书画唱的评论 (共 条)

分享到微博请遵守国家法律