Vue初探(一)——vue-router

记录一下我在vue项目中经常用到的技巧,项目中踩的小坑和解决办法


  • 使用vue-router中的meta,生成面包屑
  1. 首先在router.js路由文件中使用meta
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router);
const router = new Router({
    mode: 'hash',
    routes: [
        {
            path: '/',
            component: resolve => import('@/components/index/index.vue'),
            name: 'index',
            meta: {
                breadCrumb: [
                    {
                        label: '首页',
                        path: '/'
                    }
                ]
            }
        },
        {
            path: '/article-detail/:id',
            component: resolve => import('@/components/ip/articleDetail.vue'),
            name: 'article-detail',
            meta: {
                breadCrumb: [
                    {
                        label: '首页',
                        path: '/'
                    },
                    {
                        label: '文章详情',
                        path: '/article-detail'
                    }
                ]
            }
        }
    ]
});

export default router;

使用resolve而非import可以拆分html,breadCrumb中的path是为了在面包屑组件中使用,让每个面包屑的路径都可以跳转(具体见step 3)

  1. 将router中的数据放入vuex

使用vuex-router-sync,就可以从vuex拿到route里meta的数据

npm install vuex-router-sync
  1. 在面包屑组件breadCrumb.vue里使用meta中的数据
<template>
    <div class="ip-breadcrumb">
        <el-breadcrumb separator-class="el-icon-arrow-right">
            <el-breadcrumb-item
                v-for="item in breadCrumb"
                :key="item.label"
                :to="{ path: item.path }"
            >{{ item.label }}</el-breadcrumb-item>
        </el-breadcrumb>
    </div>
</template>

<script>
import { mapState } from 'vuex'

export default {
    computed: {
        ...mapState({
            breadCrumb: state => state.route.meta.breadCrumb || []
        })
    }
}
</script>

将meta中breadCrumb对象数组中的每一个对象,使用v-for循环拼接成面包屑即可。
(PS: 动态面包屑后续会补充。。。。动态面包屑指的是:首页>搜索文章“文章xxxx”)


  • vue-router中动态路由
  1. router.js里路径中的/:id就是动态路由
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router);
const router = new Router({
    mode: 'hash',
    routes: [
        {
            path: '/',
            component: resolve => import('@/components/index/index.vue'),
            name: 'index'
        },
        {
            path: '/ip-detail/:id',
            component: resolve => import('@/components/ip/ipDetail.vue'),
            name: 'ip-detail'  
        }
    ]
});

export default router;
  1. 再使用router-link跳转到某个具体的路由,如下
<el-table-column
    label="名称"
    width="90">
    <template slot-scope="scope">
        <router-link :to="{ path:`/article-detail/${scope.row.id}` }">
            {{ scope.row.title }}
        </router-link>
    </template>
</el-table-column>

path中使用了模版字符串的语法,${...}表示路由中的变量
(PS: el-table组件中Table-column Scoped Slot很有用,可以取到 { row, column, $index },其中row包括了每行的数据,$index可以用作行号)

  1. 跳转到某个/:id后,需要向后端发送请求,请求该id下的相应资源,请求的url中需要包含当前路由中id的具体值,可以从当前组件的$route.params获取
<script>
import { get } from '@/utils/request.js'

export default {
    data () {
        return {
            id: this.$route.params.id,
        }
    },
    created () {
        this.fetchData()
    },
    methods: {
        fetchData() {
            get(`https://www.easy-mock.com/mock/59b92d75e0dc663341a8dbe4/example/data/${this.id}`)
        }
    }
}
</script>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • awesome-github-vue 是由OpenDigg[https://blog.csdn.net/opend...
    我是七月阅读 2,438评论 0 20
  • 目录 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element★13489 ...
    余生社会阅读 20,149评论 7 233
  • 路径及文件: 修改字号:(也可以修改默认ColorScheme等) 效果就不贴了,注意修改默认值后,所有新创建的连...
    池边树下阅读 6,626评论 0 0
  • 春叙宴, 醉难看, 杯盘狼藉不知寒。 今日饯行挥别泪, 那堪折柳唱阳关。 遥祝愿, 舌耕娴, 奇葩新秀出樯兰。 科...
    luowanglin阅读 1,052评论 0 1
  • 细雨如毛斜入草,清风向晚半回环。 忘却思心是秋分,晴暖阴凉最怡然。 只恐一夜西风紧,落地黄花瘦人间。 冬去春来犹恨...
    梅心梅飞阅读 422评论 4 21