Giới thiệu về UmiJS P3 (Permission routing)

Bài viết này mình sẽ đi qua về định tuyến trong ứng dụng reactJS. Để coi nhiều cấu hình hơn các bạn xem thêm trên trang chủ umiJS

I. Một số quy ước cơ bản của định tuyến:

Định tuyến trong một ứng dụng umi có 2 cách cấu hình

Cấu hình bằng tay

Bằng cách thêm cấu hình vào trong file cấu hình định tuyến hoặc .umirc.(ts|js) hoặc config/config.(ts|js), khi đã dùng cấu hình bằng cách tạo file cấu hình thì umi sẽ không quét trong thư mục src/pages để tạo định tuyến tự động nữa.

Định tuyến được sinh ra tự động:

umi có có cơ chế kiểm tra file cấu hình định tuyến có tồn tại hay không. Nếu không tồn tại, nó tạo định tuyến cho ứng dụng tự động bằng cách quét trong thư mục src/pages
Nếu bạn có cấu hình thư mục  như dưới:

+ users/
  - index.js
  - list.js
- index.js

Khi đó, umi sẽ tự động sinh ra cấu hình định tuyến như bên dưới:

[
  { path: '/', component: './pages/index.js' },
  { path: '/users/', component: './pages/users/index.js' },
  { path: '/users/list', component: './pages/users/list.js' },
]

Cá nhân mình thì hay dùng cách tự động vì quá tiện mà đáp ứng được công việc, chỉ cần quan tâm đến tạo trang và viết mã thôi, còn lại định tuyến để umi lo.

Quy ước về định tuyến như dynamic route, optional route, nested route… các bạn coi thêm trên trang chủ umiJS nhé

II. Permission routing:

Trong trường hợp mình cần điều hướng khi người dùng chưa login vào ứng dụng, thì mình hoàn toàn có thể làm được việc này một cách dễ dàng. umi đã cung cấp cho mình sẵn khái niệm permission routing, cách sử dụng như thế nào các bạn xem từng bước sau nhé:

Với khái niệm Permisson Routing thì umi cung cấp thêm cho mình thuộc tính Routes theo từng định tuyến, xem ví dụ sau:

[
  { path: '/', component: './pages/index.js' },
  { path: '/list', component: './pages/list.js', Routes: ['./routes/PrivateRoute.js'] },
]

Bạn để ý tới thuộc tính Routes của định tuyến ứng với path là “/list”. Điều này có nghĩa là khi bạn vào link ứng với “/list” thì bạn phải thông qua một thằng cha trước nó và cha đó được định nghĩa bên trong ./routes/PrivateRoute.js, đoạn mã bên trong của PrivateRoute.js

export default (props) => {
  return (
    <div>
      <div>PrivateRoute (routes/PrivateRoute.js)</div>
      { props.children }
    </div>
  );
}

Với cơ chế trên thì lúc nào thằng page/list.js sẽ là con của ./routes/PrivateRoutes.js, Cơ chế xử lý của umi khá hay nha các bạn routing thì nested vô số cấp, và tương ứng với Permisson Routing nó cũng vậy. Dựa vào Permisson Routing và umi cung cấp thêm annotation, mình có thể hoàn toàn có thể xử lý được là ở pages nào mình cần xử lý trước khi cho vào trang hiện tại (có thể kiểm tra người dùng đã đăng nhập chưa hoặc thêm một đoạn mã dùng lại như gallery footer-top chẳng hạn)

Cấu trúc thư mục tham khảo khi sử dụng Permission routingannotation trong umi:

Mình có cấu trúc layout đơn giản sau:
HeaderFooter của ứng dụng , phần này nằm trong layout của ứng dụng.
User page content là nội dung của page user sẽ hiện thị
Galleries là phần mình muồn chèn vào trước nội dung page user
Footer top là nội dung mình mình muốn chèn ở dưới nội dung page user và trên Footer của ứng dụng
Các bạn hình dung được layout rồi chứ, mình sẽ thực thi bằng kiến trúc umi với kiến trúc thư mục sau:
với kiến trúc thư mục trên mình có đoạn mã tương ứng của các file:
./components/galleries.js, ./components/footer-top.js

// Galleries component
import React from 'react';

export default (props) => {
  return (<>
    <div>Gallies here</div>
    {props.children}
  </>);

}

// Footer top component

import React from 'react';

export default (props) => {
  return (<>
    {props.children}
    <div>Footer top here</div>
  </>);

}

./pages/user/index.js

/**
 * title: User page
 * Routes:
 *   - ./src/components/gallery.js
 *   - ./src/components/footer-top.js
 */
import { connect } from 'dva';

export default connect(({ user }) => ({ user }))(function (props) {
return <h3>User page: {props.user.currentUser}</h3>;
})

Với ./pages/user/index.js, mình xử dụng annotation umi cung cấp để khai báo title của page (User page), tiếp theo là component galleries và footer-top. Việc galleries sẽ xử lý trước là hiện trước nội dung của user page và footer-top hiện sau nội dụng user page, do bạn đặt {props.children} trước và sau thôi nhé, tham khảo code bên trên

Trường hợp trên là mình sử dụng Permission routing với tác dụng là gắn thêm thành phần vào một page tương ứng. Tương tự  với cách dùng trên thì mình cũng tạo một file ./components/authentication.js (Giống ./routes/PrivateRoute.js), mục đích là nếu user đã login thì mình hiện nội dung page user lên, không thì hiện thông báo Unauthrization (Các bạn có thể redirect tới page login chẳng hạn), nội dung mã ./components/authentication.js

import React from 'react';

export default (props) => {
  if (props.logged) {// Check user logged in
    return <>{props.children}</>;
  }
  return <>Unauthentication</>;
}

Cập nhật file ./pages/user/index.js khi thêm mã kiểm tra user đã đăng nhập hay chưa

/**
 * title: User Page
 * Routes:
 *  - ./src/components/authentication.js
 *   - ./src/components/gallery.js
 *   - ./src/components/footer-top.js
 */
import { connect } from 'dva';

export default connect(({ user }) => ({ user }))(function (props) {
return <h3>User page: {props.user.currentUser}</h3>;
})

theo thự tự thì ./components/authentication.js được thực thi đầu tiên nha các bạn

 Source code: https://github.com/truongluu/umi-routing

Giới thiệu về UmiJS P1 (Tổng quan về umiJS)
Giới thiệu về UmiJS P2 (Cấu trúc thư mục, cấu hình thường dùng)

Nguồn: umiJS

Rate this post

You May Also Like

About the Author: truongluu

2 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *