HOC에 반응하여 구성 요소 권한 기반으로 만들기
15815 단어 tutorialwebdevreactjavascript
이것은 구성 요소의 액세스 수준을 제한하기 위해 대부분의 React 애플리케이션에서 사용한 디자인 패턴입니다.
솔루션에 대해 자세히 알아보기 전에 먼저 High Order Component(HOC)가 무엇인지 이해해 봅시다.
HOC는 컴포넌트 로직을 재사용하기 위한 React의 고급 기술입니다. JavaScript의 High Order Functions 개념을 기반으로 하는 패턴입니다. 평신도 용어로 HOC는 구성 요소를 가져와 새 구성 요소를 반환하는 함수입니다. React API의 일부는 아니지만 React의 구성 특성에서 나온다는 단순한 사실입니다.
이 솔루션에서는 다음 기능을 사용하여 최종 결과를 얻습니다.
반응: 버전 ≥ 16.8
글로벌 상태 관리: 사용자 권한을 저장하고 구성 요소 트리를 통해 전달합니다. 저는 Context-Reducer를 사용할 것입니다. Redux, MobX 또는 Zusstand 등과 같은 다른 라이브러리도 사용할 수 있습니다.
해결책:
시작하려면 특정 사용자의 권한에 따라 애플리케이션의 구성 요소 액세스 수준을 제한해야 하는 애플리케이션이 있다고 가정해 보겠습니다.
Component1: 사용자에게
ACCESS_COMPONENT1
권한이 있는 경우 액세스할 수 있어야 합니다.import React from "react";
const Component1 = (props) => {
return (
<p>Component only accessible if user has ACCESS_COMPONENT1 permission</p>
);
};
export default Component1;
Component2: 사용자에게
ACCESS_COMPONENT2
권한이 있는 경우 액세스할 수 있어야 합니다.import React from "react";
const Component2 = (props) => {
return (
<p>Component only accessible if user has ACCESS_COMPONENT2 permission</p>
);
};
export default Component2;
Component3: 사용자에게
ACCESS_COMPONENT3
권한이 있는 경우 액세스할 수 있어야 합니다.import React from "react";
const Component3 = (props) => {
return (
<p>Component only accessible if user has ACCESS_COMPONENT3 permission</p>
);
};
export default Component3;
App : 위의 3가지 구성 요소를 가져오는 상위 래퍼
import React from "react";
import Component1 from './Component1';
import Component2 from './Component2';
import Component3 from './Component3';
const App = (props) => {
return (
<div>
<Component1 />
<Component2 />
<Component3 />
</div>
);
};
export default App;
UserPermissionProvider
를 생성해 보겠습니다. 또한 저장소에 액세스하기 위해 구성 요소 트리에서 사용할 수 있는 컨텍스트를 내보냅니다UserPermissionStore
. Note: I’ll be hardcoding the permissions in this example
import React, { createContext, useState, useEffect } from "react";
export const UserPermissionStore = createContext({ userPermission: {} });
const UserPermissionProvider = (props) => {
const { children } = props;
const [userPermission, setUserPermission] = useState({});
useEffect(() => {
const permissions = {
ACCESS_COMPONENT1: "ACCESS_COMPONENT1",
ACCESS_COMPONENT2: "ACCESS_COMPONENT2",
ACCESS_COMPONENT3: "ACCESS_COMPONENT3",
};
setUserPermission(permissions);
}, []);
return (
<UserPermissionStore.Provider value={{ userPermission }}>
{children}
</UserPermissionStore.Provider>
);
};
export default UserPermissionProvider;
App
컨텍스트에 액세스할 수 있도록 UserPermissionProvider
구성 요소를 UserPermissionStore
구성 요소 내의 자식으로 전달합니다.import React from "react";
import Component1 from "./Component1";
import Component2 from "./Component2";
import Component3 from "./Component3";
import UserPermissionProvider from "./UserPermissionProvider";
const App = (props) => {
return (
<UserPermissionProvider>
<div>
<Component1 />
<Component2 />
<Component3 />
</div>
</UserPermissionProvider>
);
};
export default App;
withUserPermission
를 생성합니다. 제공된 권한이 유효하면 구성 요소를 반환하고 그렇지 않으면 아무 것도 반환하지 않습니다.import React, { useContext } from "react";
import { UserPermissionStore } from "./UserPermissionProvider";
const withUserPermission = (Component, requiredPermission) => (props) => {
const { userPermission } = useContext(UserPermissionStore);
if (!userPermission[requiredPermission]) return null;
return <Component {...props} />;
};
export default withUserPermission;
withUserPermission
HOC를 사용하여 새로운 향상된 구성 요소를 만들 것입니다. 이 구성 요소는 액세스하는 데 필요한 권한이 사용자 권한에서 사용 가능한 경우에만 액세스할 수 있습니다.import React from "react";
import withUserPermission from "./withUserPermission";
const Component1: React.FC = (props) => {
return (
<p>Component only accessible if user has ACCESS_COMPONENT1 permission</p>
);
};
export default withUserPermission(Component1, 'ACCESS_COMPONENT1');
Note: Similarly we will update our Component2 and Component3 as well with their respective permissions.
제가 아는 가장 좋은 방법을 설명하려고 노력했습니다. 다른 사람들을 알고 있다면 모두를 위해 의견을 공유하십시오!
읽어주셔서 감사합니다. 더 많은 정보를 얻으려면 팔로우하세요.
Reference
이 문제에 관하여(HOC에 반응하여 구성 요소 권한 기반으로 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/imanshu03/react-hoc-to-make-components-permission-driven-35el텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)