vue-admin-template2:跳过Mock看App.vue及/router/index.js

文章详细介绍了Vue.js应用中的路由配置,包括组件、布局、重定向、嵌套路由、元信息(meta)的使用,以及scrollBehavior如何定制路由切换时的滚动行为。同时提到了router.matcher在特定情况下的重置方法。

mock没接触过,现在跳过这部分看main.js App.vue其他内容

引入App.vue及router

<template>
  <div id="app">
    <router-view />
  </div>
</template>

/router/index.js

{
    path: '/',
    component: Layout,
    redirect: '/dashboard',    //vue重定向 访问localhost:8000 会到 localhost:8000/dashboard
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: 'Dashboard', icon: 'dashboard' } 
    }]
  },

路由

此处component和redirect children 的关系:
输入localhost:8000会默认进入dashboard界面,其过程为:
先加载component中的layout,在layout/index.vue中,引入了<app-main />,appmain.vue中引入了<router-view :key="key" />这个router-view会加载children中的component,这大概就叫‘嵌套视图’
理解来自:https://router.vuejs.org/zh/guide/essentials/nested-routes.html

const routes = [
  {
    path: '/user/:id',
    component: User,
    children: [
      {
        // 当 /user/:id/profile 匹配成功
        // UserProfile 将被渲染到 User 的 <router-view> 内部
        path: 'profile',
        component: UserProfile,
      },
      {
        // 当 /user/:id/posts 匹配成功
        // UserPosts 将被渲染到 User 的 <router-view> 内部
        path: 'posts',
        component: UserPosts,
      },
    ],
  },
]

meta

meta的定义:简单来说就是路由元信息,也就是每个路由身上携带的信息。
meta的作用:vue-router路由元信息说白了就是通过meta对象中的一些属性来判断当前路由是否需要进一步处理,如果需要处理,按照自己想要的效果进行处理即可
可以再meta里设置登录验证
meta keep-alive属性具有缓存作用见https://juejin.cn/post/7098605987925327902

scrollBehavior

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({ y: 0 }),  // y=0 顶部
  routes: constantRoutes
  //  return 期望滚动到哪个的位置
})
scrollBehavior:使用前端路由,当切换到新路由时,想要页面滚到顶部,
				或者是保持原先的滚动位置,就像重新加载页面那样。
 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。
 https://v3.router.vuejs.org/zh/guide/advanced/scroll-behavior.html#%E5%BC%82%E6%AD%A5%E6%BB%9A%E5%8A%A8

router.matcher

export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

此段代码略复杂。后续用到再研究更新
至此/router/index.js分析完毕

我用cartList动态渲染页面如下: <div class="cart-item" v-for="item in cartList" :key="item.goods_id+'-'+item.goods.goods_image"> 控制台仍然报错v-for的值唯一,本质是页面中此时还没获取到cartList,控制台报错顺序是:index.js:54 [Vue warn]: Duplicate keys detected: '10041-http://smart-shop.itheima.net/uploads/10001/20230321/5c5c095502c09a9adae70d1d691b0166.jpg'. This may cause an update error. found in ---> <CartPage> at src/views/Layout/cart.vue <LayoutIndex> at src/views/Layout/index.vue <App> at src/App.vue <Root> warn @ vue.runtime.esm.js:4469 checkDuplicateKeys @ vue.runtime.esm.js:6499 createChildren @ vue.runtime.esm.js:6317 createElm @ vue.runtime.esm.js:6228 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 patch @ vue.runtime.esm.js:6691 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 init @ vue.runtime.esm.js:4264 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 patch @ vue.runtime.esm.js:6691 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 init @ vue.runtime.esm.js:4264 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 updateChildren @ vue.runtime.esm.js:6470 patchVnode @ vue.runtime.esm.js:6550 patch @ vue.runtime.esm.js:6696 Vue._update @ vue.runtime.esm.js:3660 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher.run @ vue.runtime.esm.js:3422 flushSchedulerQueue @ vue.runtime.esm.js:4007 eval @ vue.runtime.esm.js:3064 flushCallbacks @ vue.runtime.esm.js:2992 Promise.then(异步) timerFunc @ vue.runtime.esm.js:3017 nextTick @ vue.runtime.esm.js:3074 queueWatcher @ vue.runtime.esm.js:4089 Watcher.update @ vue.runtime.esm.js:3413 Dep.notify @ vue.runtime.esm.js:814 reactiveSetter @ vue.runtime.esm.js:1027 eval @ vue-router.esm.js:2520 eval @ vue-router.esm.js:2519 updateRoute @ vue-router.esm.js:2048 eval @ vue-router.esm.js:1915 eval @ vue-router.esm.js:2037 step @ vue-router.esm.js:1763 step @ vue-router.esm.js:1770 step @ vue-router.esm.js:1770 runQueue @ vue-router.esm.js:1774 eval @ vue-router.esm.js:2032 step @ vue-router.esm.js:1763 eval @ vue-router.esm.js:1767 eval @ vue-router.esm.js:2020 eval @ vue-router.esm.js:1833 iterator @ vue-router.esm.js:2002 step @ vue-router.esm.js:1766 step @ vue-router.esm.js:1770 step @ vue-router.esm.js:1770 eval @ vue-router.esm.js:1767 eval @ vue-router.esm.js:2020 eval @ index.js:54 iterator @ vue-router.esm.js:2002 step @ vue-router.esm.js:1766 step @ vue-router.esm.js:1770 runQueue @ vue-router.esm.js:1774 confirmTransition @ vue-router.esm.js:2027 transitionTo @ vue-router.esm.js:1914 push @ vue-router.esm.js:2197 eval @ vue-router.esm.js:2545 push @ vue-router.esm.js:2544 click @ index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/ProductDetail/index.vue?vue&type=template&id=70b74859&scoped=true:146 invokeWithErrorHandling @ vue.runtime.esm.js:2945 invoker @ vue.runtime.esm.js:1835 original_1._wrapper @ vue.runtime.esm.js:7063 显示另外 81 个框架 收起 index.js:54 [vuex] unknown action type: cart/setCartList dispatch @ vuex.esm.js:473 boundDispatch @ vuex.esm.js:386 created @ index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Layout/cart.vue?vue&type=script&lang=js:45 await in created(异步) invokeWithErrorHandling @ vue.runtime.esm.js:2945 callHook$1 @ vue.runtime.esm.js:3917 Vue._init @ vue.runtime.esm.js:5434 VueComponent @ vue.runtime.esm.js:5561 createComponentInstanceForVnode @ vue.runtime.esm.js:4409 init @ vue.runtime.esm.js:4263 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 patch @ vue.runtime.esm.js:6691 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 init @ vue.runtime.esm.js:4264 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 updateChildren @ vue.runtime.esm.js:6470 patchVnode @ vue.runtime.esm.js:6550 patch @ vue.runtime.esm.js:6696 Vue._update @ vue.runtime.esm.js:3660 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher.run @ vue.runtime.esm.js:3422 flushSchedulerQueue @ vue.runtime.esm.js:4007 eval @ vue.runtime.esm.js:3064 flushCallbacks @ vue.runtime.esm.js:2992 Promise.then(异步) timerFunc @ vue.runtime.esm.js:3017 nextTick @ vue.runtime.esm.js:3074 queueWatcher @ vue.runtime.esm.js:4089 Watcher.update @ vue.runtime.esm.js:3413 Dep.notify @ vue.runtime.esm.js:814 reactiveSetter @ vue.runtime.esm.js:1027 eval @ vue-router.esm.js:2520 eval @ vue-router.esm.js:2519 updateRoute @ vue-router.esm.js:2048 eval @ vue-router.esm.js:1915 eval @ vue-router.esm.js:2037 step @ vue-router.esm.js:1763 step @ vue-router.esm.js:1770 step @ vue-router.esm.js:1770 runQueue @ vue-router.esm.js:1774 eval @ vue-router.esm.js:2032 step @ vue-router.esm.js:1763 eval @ vue-router.esm.js:1767 eval @ vue-router.esm.js:2020 eval @ vue-router.esm.js:1833 iterator @ vue-router.esm.js:2002 step @ vue-router.esm.js:1766 step @ vue-router.esm.js:1770 step @ vue-router.esm.js:1770 eval @ vue-router.esm.js:1767 eval @ vue-router.esm.js:2020 eval @ index.js:54 iterator @ vue-router.esm.js:2002 step @ vue-router.esm.js:1766 step @ vue-router.esm.js:1770 runQueue @ vue-router.esm.js:1774 confirmTransition @ vue-router.esm.js:2027 transitionTo @ vue-router.esm.js:1914 push @ vue-router.esm.js:2197 eval @ vue-router.esm.js:2545 push @ vue-router.esm.js:2544 click @ index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/ProductDetail/index.vue?vue&type=template&id=70b74859&scoped=true:146 invokeWithErrorHandling @ vue.runtime.esm.js:2945 invoker @ vue.runtime.esm.js:1835 original_1._wrapper @ vue.runtime.esm.js:7063 显示另外 74 个框架 收起 index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Layout/cart.vue?vue&type=script&lang=js:47 Store cartList: (5) [{…}, {…}, {…}, {…}, {…}, __ob__: Observer]0: create_time: "2025-07-07 19:46:33"goods: Objectgoods_id: 10039goods_num: 9goods_sku_id: "0"id: (…)isChecked: trueis_delete: (…)store_id: (…)update_time: (…)user_id: (…)__ob__: Observer {value: {…}, shallow: false, mock: false, dep: Dep, vmCount: 0}get create_time: ƒ reactiveGetter()set create_time: ƒ reactiveSetter(newVal)get goods: ƒ reactiveGetter()set goods: ƒ reactiveSetter(newVal)get goods_id: ƒ reactiveGetter()set goods_id: ƒ reactiveSetter(newVal)get goods_num: ƒ reactiveGetter()set goods_num: ƒ reactiveSetter(newVal)get goods_sku_id: ƒ reactiveGetter()set goods_sku_id: ƒ reactiveSetter(newVal)get id: ƒ reactiveGetter()set id: ƒ reactiveSetter(newVal)get isChecked: ƒ reactiveGetter()set isChecked: ƒ reactiveSetter(newVal)get is_delete: ƒ reactiveGetter()set is_delete: ƒ reactiveSetter(newVal)get store_id: ƒ reactiveGetter()set store_id: ƒ reactiveSetter(newVal)get update_time: ƒ reactiveGetter()set update_time: ƒ reactiveSetter(newVal)get user_id: ƒ reactiveGetter()set user_id: ƒ reactiveSetter(newVal)[[Prototype]]: Object1: {…}2: {…}3: {…}4: {…}length: 5__ob__: Observer {value: Array(5), shallow: false, mock: false, dep: Dep, vmCount: 0}[[Prototype]]: Array index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Layout/cart.vue?vue&type=script&lang=js:48 Mapped cartList: (5) [{…}, {…}, {…}, {…}, {…}, __ob__: Observer],先输出报错,再输入 const { data } = await getCartList() // 2. 更新本地状态(如需要) this.mycartList = data.list await this.$store.dispatch('cart/setCartList', data.list) // 新增一个直接提交数据的 Action console.log('Store cartList:', this.$store.state.cart.cartList) // 应与 data.list 一致 console.log('Mapped cartList:', this.cartList) // 应同步更新,从的console.log语句,是什么原因
最新发布
07-08
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值