1. 程式人生 > >react高階元件之經典應用:許可權控制

react高階元件之經典應用:許可權控制

許可權控制算是軟體專案中的常用功能了。在網站中,許可權控制一般分為兩個維度:頁面級別和頁面元素級別。

我們來說說頁面元素粒度的許可權控制。在某個頁面中,有個“建立使用者”的按鈕,管理員才能看到。

一般想到的做法類似這樣

class Page extends Component{
  render() {
    let hasCreatePermission = tool.getAuth("createUser");  
    return (
      <div>
        {hasCreatePermission ? <Button>建立使用者</Button
> : null} </div> ); } }

在當前使用者的許可權列表中判斷是否有“建立使用者”的許可權,然後控制按鈕的顯示和隱藏。

有一天,產品經理說,“沒有許可權的話,按鈕就置灰”。於是程式碼改成了這樣:

  render() {
    let hasCreatePermission = tool.getAuth("createUser");  
    return (
      <div>
        {hasCreatePermission ? <Button>建立使用者</Button> : <Button
disabled={true}>
建立使用者</Button>} </div>
); }

過了一個月,產品經理又說,“沒有許可權的話,按鈕也正常展示,只是點選後給個'申請許可權'的文案提示”。額,硬著頭皮改了下程式碼:

  render() {
    let hasCreatePermission = tool.getAuth("createUser");  
    return (
      <div>
        {hasCreatePermission ? <Button>建立使用者</Button>
: <Button onClick={()=>alert("許可權不足,請找管理員小K申請")}>建立使用者</Button>} </div>
); }

如果網站中只有幾個許可權控制的按鈕還好,想象一下,如果有50+這樣的按鈕,內心是不是想砍需求方?

需求方是不敢砍的。那麼有沒有一種方法,可以統一控制無許可權時候的表現呢?有。讓我們來試試React的高階元件吧。

export  let wrapAuth = ComposedComponent =>class WrapComponent extends Component {
    // 構造
    constructor(props) {
      super(props);
    }

    static propTypes = {
      auth:PropTypes.string.isRequired,
    };

    render() {
      if (tool.getAuth(this.props.auth)) {
        return <ComposedComponent  { ...this.props} />;
      } else {
        return null;
      }
    }
};

這個方法實際上是一個包裝器,接受一個元件引數,根據許可權,返回一個新的元件。然後頁面按鈕的許可權控制實現改成:

const AuthButton = wrapAuth(Button);
class Page extends Component{
  render() {
    return (
      <div>
        <AuthButton  auth="createUser">建立使用者</AuthButton>
      </div>
    );
  }
}

當遇到前面所說的需求變動時,現在只要把包裝器裡return null這行程式碼改成

return <ComposedComponent disabled={true}  { ...this.props} />

或者

return <ComposedComponent onClick={()=>alert("許可權不足,請找管理員小K申請")} { ...this.props} />

就行啦。

嗯,高階元件讓生活又美好了一些~

相關推薦

react高階元件經典應用許可權控制

許可權控制算是軟體專案中的常用功能了。在網站中,許可權控制一般分為兩個維度:頁面級別和頁面元素級別。我們來說說頁面元素粒度的許可權控制。在某個頁面中,有個“建立使用者”的按鈕,管理員才能看到。一般想到的做法類似這樣class Page extends Component{

[譯]React高階話題高階元件

前言 本文為意譯,翻譯過程中摻雜本人的理解,如有誤導,請放棄繼續閱讀。 原文地址:Higher-Order Components 正文 高階元件(後文中均以HOCs來指代)是React生態裡面的一種用來複用元件邏輯的高階技術。HOCs本身並不是React API的一部分,而是一種從React的可

React高階元件(表單)應用回顧

1. 首先介紹函數語言程式設計: function hello(){ console.log('大家好,我是harry!') } function getWord(fn){ return function(){ console.log('大

DataTable繫結Table控制元件中的資料(vb.net經典應用)

Sub bind_table(ByVal tbl As DataTable)Dim cn AsNew SqlClient.SqlConnection(P_Con)        Dim cmd As SqlClient.SqlCommand = cn.CreateCommand        Dim adpt

React高階元件應用及講解

我的應用場景 通常我會通過高階元件去優化之前老專案寫的不好的地方,比如兩個頁面UI幾乎一樣,功能幾乎相同,僅僅幾個操作不太一樣,卻寫了兩個耦合很多的頁面級元件。當我去維護它的時候,由於它的耦合性過多,經常會新增一個功能(這兩個元件都要新增),我要去改完第一個的時候,還要改第

react使用總結一react 高階元件使用

1.IntervalEnhance.js定義高階元件 // 高階元件 // 主要用於替代舊的mixins import React from 'react'; //1.還記得箭頭函式嗎?沒錯,這

vue高階元件路由許可權元件

主要是用render渲染函式 在路由配置檔案中使用該元件,判斷渲染哪一個頁面 // right.js import hav

react高階元件

1 高階元件就是一個函式,且該函式接受一個元件作為引數,並返回一個新的元件 import React, { Component } from 'react'; import simpleHoc from './simple-hoc'; class Usual extends Component

深入淺出理解 React高階元件

開始之前,有兩點需要說明一下:1、React 高階元件 僅僅是一種模式,並不是 React 的基礎知識;2、它不是開發 React app 的必要知識。你可以略過此文章,仍然可以開發 React app。然而,技多不壓身,如果你也是一位 React 開發者,強烈建議你掌握它。 一、為什麼需要高階元

深入react 高階元件

高階元件: 返回值是一個函式的那麼一個函式 基本算是個類工廠方法 W (WrappedComponent) 是被包裹的 React.Component;而函式返回的 E (Enhanced Component) 則是新得到的 HOC,也是個 React.Compone

帶著三個問題深入淺出React高階元件

前言 "高階"二字聽起來非常唬人,因為大學高數課上的高階方程讓人抓狂,從而讓第一次接觸"高階元件"概念的人們誤以為又是什麼高深的思想和複雜的邏輯。但相信在你學習完成後和生產環境大量使用過程中,就會發現這個所謂"高階元件"真的一點也不高階,非常簡單易懂。本文通過回答三個問題帶你深入淺出React高

[譯]React高階話題Render Props

前言 本文為意譯,翻譯過程中摻雜本人的理解,如有誤導,請放棄繼續閱讀。 原文地址:Render Props render prop是一個技術概念。它指的是使用值為function型別的prop來實現React component之間的程式碼共享。 如果一個元件有一個render屬性,並且這個

ES 6 裝飾器與 React 高階元件

關於 Decorator 到底是 ES 6 引入的還是 ES 7 引入的我也不是很明白了,兩種說法都有,這種問題懶得糾結了……在用的時候發現這個東西很好用,平常用處可能不大,但是結合 React 就很好使了。接下來就講一講。 一、環境搭建 我搭建了一個 React 開發環境,結合 babel 的外掛——b

React高階元件精講

一、基本概念 高階函式是以函式為引數,並且返回也是函式的的函式。類似的,高階元件(簡稱HOC)接收 React 元件為引數,並且返回一個新的React元件。高階元件本質也是一個函式,並不是一個元件。高階元件的函式形式如下: const EnhanceComponen

[譯]React高階話題Forwarding Refs

前言 本文為意譯,翻譯過程中摻雜本人的理解,如有誤導,請放棄繼續閱讀。 原文地址:Forwarding Refs Ref forwarding是一種將ref鉤子自動傳遞給元件的子孫元件的技術。對於應用的大部分元件,這種技術並不是那麼的必要。然而,它對於個別的元件還是特別地有用的,尤其是那些可複用元

React 高階元件

本文將探討如何構建更易於複用,更為靈活的React高階元件。 在實際的應用開發中,多個React元件之間可能需要共用一段完成某些特定功能的程式碼,那麼如何在不同的元件間複用這段程式碼就成了一個值得思考的問題(或者說,如何建立具有類似功能的,不同的React元件)。 在

Android四大元件BroadcastReceiver應用詳解

今天我們來講一下Android中BroadcastReceiver的相關知識。 BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。 在Android系統中,廣播體現在方方面面,例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實

當初要是看了這篇,React高階元件早會了

概況: 什麼是高階元件? 高階部件是一種用於複用元件邏輯的高階技術,它並不是 React API的一部分,而是從React 演化而來的一種模式。 具體地說,高階元件就是一個接收一個元件並返回另外一個新元件的函式! 這是官方文件說的,我沒有截全,因為後面的解釋會造成誤解,但簡單講

[譯]React高階話題Context

前言 本文為意譯,翻譯過程中摻雜本人的理解,如有誤導,請放棄繼續閱讀。 原文地址:Context Context提供了一種不需要手動地通過props來層層傳遞的方式來傳遞資料。 正文 在典型的React應用中,資料是通過props,自上而下地傳遞給子元件的。但是對於被大量元件使用的固定型別

R6- React高階元件詳解

看題目感覺好高階的樣子,千萬不要被名字嚇到,它一點都不高深。 按照慣例先上圖,這一章的概覽: 1.從高階函式說起 維基百科對高階函式的定義: 在數學和電腦科學中,高階函式是至少滿足下列一個條件的函式: 接受一個或多個函式作為輸入 輸出一個函式 是不是很