首页 > 其他分享 >组件导航守卫 常见的使用场景

组件导航守卫 常见的使用场景

时间:2025-01-14 16:11:15浏览次数:1  
标签:场景 default vm next 守卫 export 组件 data

组件导航守卫通常用于处理组件级别的特定逻辑。以下是一些常见的使用场景:

1、表单数据保存提醒:

<template>
  <div>
    <form @submit.prevent="handleSubmit">
      <input v-model="formData.name" />
      <!-- 其他表单字段 -->
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        name: '',
      },
      isFormDirty: false
    }
  },
  // 监听表单变化
  watch: {
    formData: {
      handler() {
        this.isFormDirty = true
      },
      deep: true
    }
  },
  // 离开路由前确认
  beforeRouteLeave(to, from, next) {
    if (this.isFormDirty) {
      const answer = window.confirm('表单未保存,确定要离开吗?')
      if (answer) {
        next()
      } else {
        next(false)
      }
    } else {
      next()
    }
  }
}
</script>

2、组件数据预加载:

<script>
export default {
  data() {
    return {
      pageData: null,
      loading: true
    }
  },
  beforeRouteEnter(to, from, next) {
    // 在渲染组件前获取数据
    fetchPageData(to.params.id)
      .then(data => {
        next(vm => {
          vm.pageData = data
          vm.loading = false
        })
      })
      .catch(error => {
        next(vm => {
          vm.error = error
          vm.loading = false
        })
      })
  }
}
</script>

3、记录/恢复滚动位置:

<script>
export default {
  data() {
    return {
      scrollPosition: 0
    }
  },
  // 离开前保存位置
  beforeRouteLeave(to, from, next) {
    this.scrollPosition = window.scrollY
    localStorage.setItem('scrollPosition', this.scrollPosition)
    next()
  },
  // 返回时恢复位置
  beforeRouteEnter(to, from, next) {
    next(vm => {
      const savedPosition = localStorage.getItem('scrollPosition')
      if (savedPosition) {
        window.scrollTo(0, parseInt(savedPosition))
      }
    })
  }
}
</script>

4、组件内参数变化处理:

<script>
export default {
  beforeRouteUpdate(to, from, next) {
    // 路由参数改变时重新获取数据
    // 例如: /user/1 到 /user/2
    this.userData = null
    this.fetchUserData(to.params.id)
    next()
  },
  methods: {
    fetchUserData(id) {
      // 获取数据的逻辑
    }
  }
}
</script>

5、权限切换处理:

<script>
export default {
  beforeRouteUpdate(to, from, next) {
    // 检查用户是否仍有权限访问新路由
    if (to.meta.requiredRole && !this.hasRole(to.meta.requiredRole)) {
      next({ name: 'unauthorized' })
    } else {
      next()
    }
  },
  methods: {
    hasRole(role) {
      // 检查权限的逻辑
    }
  }
}
</script>

6、组件状态重置:

<script>
export default {
  data() {
    return {
      filters: {},
      sortBy: 'default',
      currentPage: 1
    }
  },
  beforeRouteLeave(to, from, next) {
    // 离开组件时重置状态
    this.resetState()
    next()
  },
  methods: {
    resetState() {
      this.filters = {}
      this.sortBy = 'default'
      this.currentPage = 1
    }
  }
}
</script>

7、缓存控制:

<script>
export default {
  beforeRouteLeave(to, from, next) {
    // 离开时决定是否保留组件缓存
    if (to.meta.clearCache) {
      this.$destroy()
      this.$el.parentNode.removeChild(this.$el)
    }
    next()
  }
}
</script>

8、动画状态处理:

<script>
export default {
  beforeRouteEnter(to, from, next) {
    next(vm => {
      vm.startEntryAnimation()
    })
  },
  beforeRouteLeave(to, from, next) {
    // 确保离开动画完成后再跳转
    this.startExitAnimation().then(() => {
      next()
    })
  },
  methods: {
    startEntryAnimation() {
      // 入场动画逻辑
    },
    startExitAnimation() {
      // 离场动画逻辑
      return new Promise(resolve => {
        setTimeout(resolve, 500) // 动画时长
      })
    }
  }
}
</script>

组件导航守卫主要用于:

  1. 处理组件特定的路由逻辑
  2. 表单处理和数据保存
  3. 组件状态管理
  4. 数据预加载
  5. 权限控制
  6. 动画处理
  7. 缓存控制
  8. 用户体验优化(如滚动位置)

而全局性的逻辑(如用户认证、全局权限等)则应该放在全局导航守卫中处理。

标签:场景,default,vm,next,守卫,export,组件,data
From: https://www.cnblogs.com/linxmouse/p/18671013

相关文章

  • Pinia 替代 localStorage 的常规使用场景
    在现代Vue工程化项目中,通常推荐使用Pinia(或Vuex)来管理状态,而不是直接使用localStorage。我来解释下具体原因和使用方式:1、为什么使用Pinia替代localStorage://使用Pinia的优势:-状态集中管理,更容易维护-支持响应式-支持开发工具调试-支持TypeScript-可以配......
  • 应用场景——教育培训类二、学习路径规划助手开发实战(根据学生画像生成学习规划)
    通过大模型实现个性化学习路径规划与自适应教育在现代教育中,个性化学习正在逐步成为一种趋势。每个学生都有不同的学习需求、兴趣偏好和学习节奏。传统的“一刀切”教学模式很难满足每个学生的个性化需求。因此,如何为学生提供个性化的学习路径规划,帮助他们以最合适的方式进......
  • 【VUE】父子组件联动实现动态样式控制
    相关组件:父组件:src/views/erp/contract/Form.vue子组件:src/views/erp/contract/modules/PlanTable.vue实现思路:1.根据已有的isEdit判断状态是不是编辑或者新增,将状态传递给子组件2.子组件根据状态来决定是否添加星号样式具体方法:1.将原来的固定样式,改为动态样式{title......
  • cliproxy海外 IP 的应用场景
    在当今全球化与数字化深度交织的时代,海外IP扮演着愈发关键的角色,其应用场景广泛地渗透到诸多领域,为个人、企业乃至科研机构开辟了新的发展路径。一、跨境电商运营对于跨境电商从业者而言,海外IP堪称业务拓展的得力助手。一方面,在店铺注册环节,部分海外电商平台基于地域限制......
  • uniapp精仿微信UI,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频
    uniapp精仿微信UI,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频商城小工具等,朋友圈视频号即时聊天用于视频,商城,直播,聊天,等等场景,源码分享sumer-weixin介绍uniapp精仿微信UI界面,基于SumerUI3.0和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,......
  • RN/H5多设备自适应组件库来了,高效实现鸿蒙原生应用多设备精致体验
    在原生鸿蒙应用开发中,华为针对ArkUI框架推出了一整套针对多设备适配的完善能力(如“一多”能力)以及高阶组件(如分栏、边看边评等),帮助开发者轻松实现“一次开发,多端部署”。然而,当前鸿蒙生态仍存在大量用跨平台框架开发的应用,部分页面采用ReactNative(RN)和H5等框架开发,这些框架在系统......
  • 鸿蒙开发 - 自定义组件 和 组件通信的方法
    自定义组件的基本结构@Entry@ComponentstructMyComponent{build(){//...}}build()函数build()函数用于描述组件的UI界面,自定义组件必须定义build()函数build(){Column(){Text('测试')Button('点击')}}struct关键字strcut用来......
  • C++中线程同步与互斥的4种方式介绍、对比、场景举例
    在C++中,当两个或更多的线程需要访问共享数据时,就会出现线程安全问题。这是因为,如果没有适当的同步机制,一个线程可能在另一个线程还没有完成对数据的修改就开始访问数据,这将导致数据的不一致性和程序的不可预测性。为了解决这个问题,C++提供了多种线程同步和互斥的机制。1.......
  • margin和padding使用的场景有哪些?
    在前端开发中,margin和padding是两个非常重要的CSS属性,它们分别用于控制元素外部和内部的间距。以下是margin和padding使用的具体场景:margin的使用场景:元素间距调整:当需要调整不同元素之间的距离时,可以使用margin。例如,设置两个段落之间的间距,使得页面布局更加清晰和美观。外部......
  • 说说你对域名收敛和域名发散的理解?分别在什么场景下使用?
    域名收敛和域名发散是前端开发中两种常见的资源加载策略,它们主要涉及到静态资源的组织和加载方式。下面是对这两种策略的理解及其使用场景的描述:域名发散:理解:域名发散是指将静态资源(如图片、CSS、JavaScript等)分布在不同的子域名下。这样做主要是为了突破浏览器对同一域名下并......