목차
로그인 상태 저장 " >로그인 상태 저장
데이터 저장을 위한 로그인 성공 " >데이터 저장을 위한 로그인 성공
store" >store
구성 요소의 동적 로딩" >구성 요소의 동적 로딩
핵심 아이디어" >핵심 아이디어
데이터 요청 타이밍" >데이터 요청 타이밍
Route Navigation Guard" >Route Navigation Guard
菜单渲染" >菜单渲染
웹 프론트엔드 JS 튜토리얼 권한 관리 모듈에서 Vue 구성 요소 인스턴스를 동적으로 로드하는 방법에 대한 자세한 설명

권한 관리 모듈에서 Vue 구성 요소 인스턴스를 동적으로 로드하는 방법에 대한 자세한 설명

Jan 16, 2018 pm 05:09 PM
동적 기준 치수

이 시리즈 기사는 단계별 튜토리얼이 아닙니다. 주로 핵심 아이디어를 소개하고 핵심 코드를 설명합니다. 친구들은 GitHub에서 전체 코드를 별표 표시하고 복제하여 공부할 수 있습니다. 그리고 원래는 프로젝트를 실행해서 친구들이 볼 수 있도록 온라인에 올릴 생각이었는데, 서버를 사기 전에 돈을 아끼기 위해 메모리가 512M에 불과했고, 두 개의 애플리케이션을 실행할 수 없었습니다(이미 V Tribe가 있습니다). 오픈 소스 프로젝트 실행 중)이므로 아래 스크린샷만 볼 수 있습니다. GitHub에 배포 튜토리얼이 있으므로 전체 효과를 확인할 수도 있습니다.


프로젝트 주소: https://github.com/lenve/vhr

이전 글에서는 기본적으로 서버 측 문제를 해결하고 프런트 엔드 요청을 캡슐화했습니다. 주로 로그인과 구성 요소의 동적 로딩에 대해 설명합니다.

이 기사는 이 시리즈의 다섯 번째 기사입니다. 이 기사를 더 잘 이해하려면 이전 기사를 먼저 읽어 보는 것이 좋습니다.

1 SpringBoot+Vue는 프런트엔드와 백엔드를 분리하고 Spring Security를 ​​사용합니다. 권한 문제를 완벽하게 처리하기 위해 (1)
2.SpringBoot+Vue는 프런트엔드와 백엔드를 분리하고 SpringSecurity를 ​​사용하여 권한 문제를 완벽하게 처리합니다. (2)
3.SpringSecurity의 비밀번호 솔팅 및 SpringBoot의 통합 예외 처리
4.axios 요청 캡슐화 통합 예외 처리

로그인 상태 저장

사용자가 성공적으로 로그인한 후에는 현재 사용자의 로그인 정보를 나중에 사용할 수 있도록 로컬에 저장해야 합니다. 구체적인 구현은 다음과 같습니다.

데이터 저장을 위한 로그인 성공

로그인 작업이 성공적으로 수행된 후 커밋 작업을 통해 데이터가 스토어에 제출됩니다.

<span style="font-size: 14px;">this.postRequest('/login', {<br>    username: this.loginForm.username,<br>    password: this.loginForm.password<br>}).then(resp=> {<br>    if (resp && resp.status == 200) {<br>    var data = resp.data;<br>    _this.$store.commit('login', data.msg);<br>    var path = _this.$route.query.redirect;<br>    _this.$router.replace({path: path == '/' || path == undefined ? '/home' : path});<br>    }<br>});<br></span>
로그인 후 복사

store

스토어의 핵심 코드는 다음과 같습니다.

<span style="font-size: 14px;">export default new Vuex.Store({<br>  state: {<br>    user: {<br>      name: window.localStorage.getItem('user' || '[]') == null ? '未登录' : JSON.parse(window.localStorage.getItem('user' || '[]')).name,<br>      userface: window.localStorage.getItem('user' || '[]') == null ? '' : JSON.parse(window.localStorage.getItem('user' || '[]')).userface<br>    }<br>  },<br>  mutations: {<br>    login(state, user){<br>      state.user = user;<br>      window.localStorage.setItem('user', JSON.stringify(user));<br>    },<br>    logout(state){<br>      window.localStorage.removeItem('user');<br>    }<br>  }<br>});<br></span>
로그인 후 복사

문제를 줄이기 위해 사용자가 성공적으로 로그인한 후의 데이터는 localStorage에 저장됩니다(사용자가 로그인한 후 데이터 손실을 방지하기 위해). F5를 눌러 새로고침), 문자열 형식으로 저장한 다음 검색 시 json으로 변환합니다. 사용자가 로그아웃하면 localStorage의 데이터를 지웁니다.

구성 요소의 동적 로딩

권한 관리 모듈에서는 이것이 프런트 엔드의 핵심으로 간주됩니다.

핵심 아이디어

사용자는 성공적으로 로그인한 후 홈 페이지에 들어가기 전에 서버에 요청을 보내 현재 메뉴 정보와 구성 요소 정보를 가져옵니다. 해당 리소스는 json 문자열을 반환합니다. 다음 형식:

<span style="font-size: 14px;">[<br>    {<br>        "id": 2,<br>        "path": "/home",<br>        "component": "Home",<br>        "name": "员工资料",<br>        "iconCls": "fa fa-user-circle-o",<br>        "children": [<br>            {<br>                "id": null,<br>                "path": "/emp/basic",<br>                "component": "EmpBasic",<br>                "name": "基本资料",<br>                "iconCls": null,<br>                "children": [],<br>                "meta": {<br>                    "keepAlive": false,<br>                    "requireAuth": true<br>                }<br>            },<br>            {<br>                "id": null,<br>                "path": "/emp/adv",<br>                "component": "EmpAdv",<br>                "name": "高级资料",<br>                "iconCls": null,<br>                "children": [],<br>                "meta": {<br>                    "keepAlive": false,<br>                    "requireAuth": true<br>                }<br>            }<br>        ],<br>        "meta": {<br>            "keepAlive": false,<br>            "requireAuth": true<br>        }<br>    }<br>]<br></span>
로그인 후 복사

이 문자열을 얻은 후 프런트 엔드는 두 가지 작업을 수행합니다. 1. 현재 경로에 json을 동적으로 추가합니다. 2. 데이터를 스토어에 저장한 다음 각 페이지는 데이터를 기반으로 메뉴를 렌더링합니다. 가게에서.

핵심 아이디어는 어렵지 않습니다. 구현 단계를 살펴보겠습니다.

데이터 요청 타이밍

이것은 매우 중요합니다.

왜 이렇게 어려운지 물어보는 친구들도 있는데, 로그인 성공 후 바로 요청하면 안되나요? 예, 로그인 성공 후 메뉴 리소스를 요청할 수 있습니다. 요청을 받은 후 다음 번 사용을 위해 스토어에 저장하지만, 사용자가 성공한 후 특정 하위 항목을 클릭하면 또 다른 문제가 발생합니다. 로그인 후 페이지에 진입 후 F5를 눌러 새로고침을 하면 이때는 GG인데, F5를 새로고침하면 스토어의 데이터가 사라지고, 로그인시 메뉴 리소스를 한 번만 요청했기 때문입니다. 이 문제를 해결하기 위한 두 가지 아이디어가 있습니다. 1. 메뉴 리소스를 저장소에 저장하지 말고, F5를 새로 고친 후에도 데이터가 그대로 유지되도록 localStorage에 저장합니다. 2. 마운트된 메서드에서 직접; 각 페이지에서 메뉴 리소스 로드로 이동하세요.

메뉴 리소스는 매우 민감하기 때문에 로컬에 저장하지 않는 것이 가장 좋기 때문에 옵션 1은 포기하지만, 옵션 2는 작업량이 좀 많아서 단순화하는 방법을 채택했습니다. 경로에 내비게이션 가드를 사용하는 것입니다.

Route Navigation Guard

내 구체적인 구현은 다음과 같습니다. 먼저 저장소에 빈 배열인 경로 배열을 만든 다음 다음과 같이 경로 전역 가드를 켭니다.

<span style="font-size: 14px;">router.beforeEach((to, from, next)=> {<br>    if (to.name == 'Login') {<br>      next();<br>      return;<br>    }<br>    var name = store.state.user.name;<br>    if (name == '未登录') {<br>      if (to.meta.requireAuth || to.name == null) {<br>        next({path: '/', query: {redirect: to.path}})<br>      } else {<br>        next();<br>      }<br>    } else {<br>      initMenu(router, store);<br>      next();<br>    }<br>  }<br>)<br></span>
로그인 후 복사

여기 코드는 매우 짧습니다. 간단히 설명하겠습니다.
1. 이동하려는 페이지가 로그인 페이지인 경우 이에 대해 말할 것도 없고 바로 이동하세요.

2.如果不是登录页面的话,我先从store中获取当前的登录状态,如果未登录,则通过路由中meta属性的requireAuth属性判断要去的页面是否需要登录,如果需要登录,则跳回登录页面,同时将要去的页面的path作为参数传给登录页面,以便在登录成功之后跳转到目标页面,如果不需要登录,则直接过(事实上,本项目中只有Login页面不需要登录);如果已经登录了,则先初始化菜单,再跳转。

初始化菜单的操作如下:

<span style="font-size: 14px;">export const initMenu = (router, store)=> {<br>  if (store.state.routes.length > 0) {<br>    return;<br>  }<br>  getRequest("/config/sysmenu").then(resp=> {<br>    if (resp && resp.status == 200) {<br>      var fmtRoutes = formatRoutes(resp.data);<br>      router.addRoutes(fmtRoutes);<br>      store.commit('initMenu', fmtRoutes);<br>    }<br>  })<br>}<br>export const formatRoutes = (routes)=> {<br>  let fmRoutes = [];<br>  routes.forEach(router=> {<br>    let {<br>      path,<br>      component,<br>      name,<br>      meta,<br>      iconCls,<br>      children<br>    } = router;<br>    if (children && children instanceof Array) {<br>      children = formatRoutes(children);<br>    }<br>    let fmRouter = {<br>      path: path,<br>      component(resolve){<br>        if (component.startsWith("Home")) {<br>          require(['../components/' + component + '.vue'], resolve)<br>        } else if (component.startsWith("Emp")) {<br>          require(['../components/emp/' + component + '.vue'], resolve)<br>        } else if (component.startsWith("Per")) {<br>          require(['../components/personnel/' + component + '.vue'], resolve)<br>        } else if (component.startsWith("Sal")) {<br>          require(['../components/salary/' + component + '.vue'], resolve)<br>        } else if (component.startsWith("Sta")) {<br>          require(['../components/statistics/' + component + '.vue'], resolve)<br>        } else if (component.startsWith("Sys")) {<br>          require(['../components/system/' + component + '.vue'], resolve)<br>        }<br>      },<br>      name: name,<br>      iconCls: iconCls,<br>      meta: meta,<br>      children: children<br>    };<br>    fmRoutes.push(fmRouter);<br>  })<br>  return fmRoutes;<br>}<br></span>
로그인 후 복사

在初始化菜单中,首先判断store中的数据是否存在,如果存在,说明这次跳转是正常的跳转,而不是用户按F5或者直接在地址栏输入某个地址进入的。否则就去加载菜单。拿到菜单之后,首先通过formatRoutes方法将服务器返回的json转为router需要的格式,这里主要是转component,因为服务端返回的component是一个字符串,而router中需要的却是一个组件,因此我们在formatRoutes方法中动态的加载需要的组件即可。数据格式准备成功之后,一方面将数据存到store中,另一方面利用路由中的addRoutes方法将之动态添加到路由中。

菜单渲染

最后,在Home页中,从store中获取菜单json,渲染成菜单即可,相关代码可以在<span style="font-size: 14px;">Home.vue</span>中查看,不赘述。

OK,如此之后,不同用户登录成功之后就可以看到不同的菜单了。

相关推荐:

vue组件之Alert详解

jquery加载单文件vue组件方法分享

实例详解vue组件父子间通信之聊天室


위 내용은 권한 관리 모듈에서 Vue 구성 요소 인스턴스를 동적으로 로드하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WLAN 확장 모듈이 중지되었습니다. [수정] WLAN 확장 모듈이 중지되었습니다. [수정] Feb 19, 2024 pm 02:18 PM

Windows 컴퓨터의 WLAN 확장 모듈에 문제가 있는 경우 인터넷 연결이 끊어질 수 있습니다. 이러한 상황은 종종 좌절감을 주지만 다행히도 이 문서에서는 이 문제를 해결하고 무선 연결이 다시 제대로 작동하도록 하는 데 도움이 될 수 있는 몇 가지 간단한 제안 사항을 제공합니다. WLAN 확장성 모듈 복구가 중지되었습니다. Windows 컴퓨터에서 WLAN 확장성 모듈의 작동이 중지된 경우 다음 제안에 따라 문제를 해결하십시오. 네트워크 및 인터넷 문제 해결사를 실행하여 무선 네트워크 연결을 비활성화했다가 다시 활성화하십시오. WLAN 자동 구성 서비스 다시 시작 전원 옵션 수정 수정 고급 전원 설정 네트워크 어댑터 드라이버 재설치 일부 네트워크 명령 실행 이제 자세히 살펴보겠습니다.

WLAN 확장성 모듈을 시작할 수 없습니다. WLAN 확장성 모듈을 시작할 수 없습니다. Feb 19, 2024 pm 05:09 PM

이 문서에서는 무선 LAN 확장 모듈을 시작할 수 없음을 나타내는 이벤트 ID10000을 해결하는 방법을 자세히 설명합니다. 이 오류는 Windows 11/10 PC의 이벤트 로그에 나타날 수 있습니다. WLAN 확장성 모듈은 IHV(독립 하드웨어 공급업체) 및 ISV(독립 소프트웨어 공급업체)가 사용자에게 맞춤형 무선 네트워크 기능을 제공할 수 있도록 하는 Windows의 구성 요소입니다. Windows 기본 기능을 추가하여 기본 Windows 네트워크 구성 요소의 기능을 확장합니다. WLAN 확장성 모듈은 운영 체제가 네트워크 구성 요소를 로드할 때 초기화의 일부로 시작됩니다. 무선 LAN 확장 모듈에 문제가 발생하여 시작할 수 없는 경우 이벤트 뷰어 로그에 오류 메시지가 표시될 수 있습니다.

VirtualBox 고정 디스크를 동적 디스크로 또는 그 반대로 변환 VirtualBox 고정 디스크를 동적 디스크로 또는 그 반대로 변환 Mar 25, 2024 am 09:36 AM

가상 머신을 생성할 때 디스크 유형을 선택하라는 메시지가 표시되며 고정 디스크 또는 동적 디스크를 선택할 수 있습니다. 고정 디스크를 선택했지만 나중에 동적 디스크가 필요하다는 사실을 깨닫게 된다면 어떻게 될까요? 아니면 그 반대의 경우도 가능합니다. 이번 포스팅에서는 VirtualBox 고정 디스크를 동적 디스크로 또는 그 반대로 변환하는 방법을 살펴보겠습니다. 동적 디스크는 처음에는 크기가 작다가 가상 머신에 데이터를 저장함에 따라 크기가 커지는 가상 하드 디스크입니다. 동적 디스크는 필요한 만큼만 호스트 저장 공간을 차지하므로 저장 공간을 절약하는 데 매우 효율적입니다. 그러나 디스크 용량이 늘어나면 컴퓨터 성능이 약간 영향을 받을 수 있습니다. 고정 디스크와 동적 디스크는 일반적으로 가상 머신에서 사용됩니다.

Windows 11에서 동적 디스크를 기본 디스크로 변환하는 방법 Windows 11에서 동적 디스크를 기본 디스크로 변환하는 방법 Sep 23, 2023 pm 11:33 PM

Windows 11에서 동적 디스크를 기본 디스크로 변환하려면 먼저 백업을 생성해야 합니다. 프로세스에서 해당 디스크의 모든 데이터가 지워지기 때문입니다. Windows 11에서 동적 디스크를 기본 디스크로 변환해야 하는 이유는 무엇입니까? Microsoft에 따르면 동적 디스크는 Windows에서 더 이상 사용되지 않으며 더 이상 사용이 권장되지 않습니다. 또한 Windows Home Edition은 동적 디스크를 지원하지 않으므로 이러한 논리 드라이브에 액세스할 수 없습니다. 더 많은 디스크를 더 큰 볼륨으로 결합하려면 기본 디스크 또는 저장소 공간을 사용하는 것이 좋습니다. 이 기사에서는 Windows 11에서 동적 디스크를 기본 디스크로 변환하는 방법을 설명합니다. Windows 11에서 동적 디스크를 기본 디스크로 변환하는 방법은 무엇입니까? 처음에는

Illustrator에서 플러그인 로드 중 오류 발생 [수정됨] Illustrator에서 플러그인 로드 중 오류 발생 [수정됨] Feb 19, 2024 pm 12:00 PM

Adobe Illustrator를 시작할 때 플러그인 로딩 오류에 대한 메시지가 팝업됩니까? 일부 Illustrator 사용자는 응용 프로그램을 열 때 이 오류가 발생했습니다. 메시지 뒤에는 문제가 있는 플러그인 목록이 표시됩니다. 이 오류 메시지는 설치된 플러그인에 문제가 있음을 나타내지만 손상된 Visual C++ DLL 파일이나 손상된 기본 설정 파일과 같은 다른 이유로 인해 발생할 수도 있습니다. 이 오류가 발생하면 이 문서에서 문제 해결 방법을 안내하므로 아래 내용을 계속 읽어보세요. Illustrator에서 플러그인 로드 오류 Adobe Illustrator를 시작하려고 할 때 "플러그인 로드 오류" 오류 메시지가 표시되면 다음을 사용할 수 있습니다. 관리자로

Stremio 자막이 작동하지 않습니다. 자막을 로드하는 중 오류가 발생했습니다. Stremio 자막이 작동하지 않습니다. 자막을 로드하는 중 오류가 발생했습니다. Feb 24, 2024 am 09:50 AM

Windows PC의 Stremio에서 자막이 작동하지 않습니까? 일부 Stremio 사용자는 동영상에 자막이 표시되지 않는다고 보고했습니다. 많은 사용자들이 "자막을 로드하는 중 오류가 발생했습니다."라는 오류 메시지가 나타났다고 보고했습니다. 이 오류와 함께 나타나는 전체 오류 메시지는 다음과 같습니다. 자막을 로드하는 동안 오류가 발생했습니다. 자막을 로드하지 못했습니다. 이는 사용 중인 플러그인이나 네트워크에 문제가 있을 수 있습니다. 오류 메시지에서 알 수 있듯이 인터넷 연결로 인해 오류가 발생할 수 있습니다. 따라서 네트워크 연결을 확인하고 인터넷이 제대로 작동하는지 확인하십시오. 이 외에도 충돌하는 자막 추가 기능, 특정 비디오 콘텐츠에 대해 지원되지 않는 자막, 오래된 Stremio 앱 등 이 오류의 다른 이유가 있을 수 있습니다. 좋다

PHP는 무한 스크롤 로딩을 구현합니다. PHP는 무한 스크롤 로딩을 구현합니다. Jun 22, 2023 am 08:30 AM

인터넷이 발전하면서 점점 더 많은 웹페이지에서 스크롤 로딩을 지원해야 하는데, 무한 스크롤 로딩이 그 중 하나입니다. 이를 통해 페이지에 새로운 콘텐츠가 지속적으로 로드되어 사용자가 웹을 보다 원활하게 탐색할 수 있습니다. 이번 글에서는 PHP를 이용하여 무한 스크롤 로딩을 구현하는 방법을 소개하겠습니다. 1. 무한 스크롤 로딩이란 무엇인가요? 무한 스크롤 로딩은 스크롤 막대를 기반으로 웹 콘텐츠를 로딩하는 방법입니다. 그 원리는 사용자가 페이지 하단으로 스크롤할 때 AJAX를 통해 배경 데이터를 비동기적으로 검색하여 지속적으로 새 콘텐츠를 로드하는 것입니다. 이런 종류의 로딩 방법

하이퍼링크를 삽입하면 Outlook이 정지됩니다. 하이퍼링크를 삽입하면 Outlook이 정지됩니다. Feb 19, 2024 pm 03:00 PM

Outlook에 하이퍼링크를 삽입할 때 정지 문제가 발생하는 경우 불안정한 네트워크 연결, 이전 Outlook 버전, 바이러스 백신 소프트웨어의 간섭 또는 추가 기능 충돌이 원인일 수 있습니다. 이러한 요인으로 인해 Outlook이 하이퍼링크 작업을 제대로 처리하지 못할 수 있습니다. 하이퍼링크를 삽입할 때 Outlook이 멈추는 문제 해결 다음 수정 사항을 사용하여 하이퍼링크를 삽입할 때 Outlook이 멈추는 문제를 해결하세요. 설치된 추가 기능 확인 Outlook 업데이트 일시적으로 바이러스 백신 소프트웨어를 비활성화한 다음 새 사용자 프로필을 만들어 보세요. Office 앱 수정 프로그램 Office 제거 및 재설치 시작하겠습니다. 1] 설치된 추가 기능을 확인하세요. Outlook에 설치된 추가 기능이 문제의 원인일 수 있습니다.

See all articles