溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

react高階組件經(jīng)典應(yīng)用之權(quán)限控制詳解

發(fā)布時(shí)間:2020-10-15 11:06:43 來(lái)源:腳本之家 閱讀:190 作者:marginyu 欄目:web開發(fā)

前言

所謂高級(jí)組件,即:接受一個(gè)組件作為參數(shù),并且其返回值也為一個(gè)react組件

而大家應(yīng)該都知道,權(quán)限控制算是軟件項(xiàng)目中的常用功能了。在網(wǎng)站中,權(quán)限控制一般分為兩個(gè)維度:頁(yè)面級(jí)別和頁(yè)面元素級(jí)別。

我們來(lái)說說頁(yè)面元素粒度的權(quán)限控制。在某個(gè)頁(yè)面中,有個(gè)“創(chuàng)建用戶”的按鈕,管理員才能看到。

一般想到的做法類似這樣

class Page extends Component{
 render() {
 let hasCreatePermission = tool.getAuth("createUser"); 
 return (
  <div>
  {hasCreatePermission ? <Button>創(chuàng)建用戶</Button> : null}
  </div>
 );
 }
}

在當(dāng)前用戶的權(quán)限列表中判斷是否有“創(chuàng)建用戶”的權(quán)限,然后控制按鈕的顯示和隱藏。

有一天,產(chǎn)品經(jīng)理說,“沒有權(quán)限的話,按鈕就置灰”。

于是代碼改成了這樣:

 render() {
 let hasCreatePermission = tool.getAuth("createUser"); 
 return (
  <div>
  {hasCreatePermission ? <Button>創(chuàng)建用戶</Button> : <Button disabled={true}>創(chuàng)建用戶</Button>}
  </div>
 );
 }

過了一個(gè)月,產(chǎn)品經(jīng)理又說,“沒有權(quán)限的話,按鈕也正常展示,只是點(diǎn)擊后給個(gè)'申請(qǐng)權(quán)限'的文案提示”。

額,硬著頭皮改了下代碼:

 render() {
 let hasCreatePermission = tool.getAuth("createUser"); 
 return (
  <div>
  {hasCreatePermission ? <Button>創(chuàng)建用戶</Button> : <Button onClick={()=>alert("權(quán)限不足,請(qǐng)找管理員小K申請(qǐng)")}>創(chuàng)建用戶</Button>}
  </div>
 );
 }

如果網(wǎng)站中只有幾個(gè)權(quán)限控制的按鈕還好,想象一下,如果有50+這樣的按鈕,內(nèi)心是不是想砍需求方?

需求方是不敢砍的。那么有沒有一種方法,可以統(tǒng)一控制無(wú)權(quán)限時(shí)候的表現(xiàn)呢?

有。讓我們來(lái)試試React的高階組件吧。

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

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

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

這個(gè)方法實(shí)際上是一個(gè)包裝器,接受一個(gè)組件參數(shù),根據(jù)權(quán)限,返回一個(gè)新的組件。

然后頁(yè)面按鈕的權(quán)限控制實(shí)現(xiàn)改成:

const AuthButton = wrapAuth(Button);
class Page extends Component{
 render() {
 return (
  <div>
  <AuthButton auth="createUser">創(chuàng)建用戶</AuthButton>
  </div>
 );
 }
}

當(dāng)遇到前面所說的需求變動(dòng)時(shí),現(xiàn)在只要把包裝器里return null這行代碼改成

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

或者

return <ComposedComponent onClick={()=>alert("權(quán)限不足,請(qǐng)找管理員小K申請(qǐng)")} { ...this.props} />

就行啦。

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI