2017-05-17 8 views
0

PersonCreate 컨트롤러가 있습니다. 이 구성 요소에서 인증 된 사용자 (this.props.app.session.user.role.isAdmin())의 역할을 확인하고 값에 따라 양식을 렌더링해야합니다.사실을 반환하지 않는 한 구성 요소 마운팅 연기

문제는 세션 개체를 생성하는 데 시간이 걸리는 것입니다. http://.../person/create에 대한 끝점을 찾아 볼 때 this.props.app.session.user.role.isAdmin()을 호출하려고하는데, 세션이 아직 생성되지 않았으므로 널 포인터 예외가 발생합니다.

내 라우터 파일은 다음과 같습니다.

class RootComponent extends React.Component<any, any> { 

    private generateSession() { 
    store.dispatch(SessionActions.generate()); 
    } 

    public render() { 
    return (
     <Router history={browserHistory}> 
     <Route path="/" component={Layout}> 
      <Route path="app" onEnter={this.generateSession}> 
      <Route path="person"> 
       <Route path="create" component={PersonCreate} /> 
       <Route path="update/:id" component={PersonUpdate} /> 
       <Route path="delete/:id" component={PersonDelete} /> 

    ... 

는 기본적으로 store.dispatch(SessionActions.generate())는 asyncronous 물건의 일련을하는 Saga를 생성합니다. (예 : 토큰 유효성 검사, 세션 정보 얻기, 로컬 저장소 새로 고침 등). 완료 후 구성 요소 렌더링을 시작해야합니다.

아이디어가 있으십니까?

public render() { 
    if (!this.props.app.session) { 
    return null; 
    } 

을 그리고 세션이 초기화됩니다 후에 경로를 렌더링 :

+1

당신이보고있는 문제 : 당신은 여기에이 방법에 대한 자세한 내용을보실 수 있습니다

render() { if (isLoggedIn) { return <AppropriateUserForm />; } else { return <LoadingIndicator />; } } 

:

<Route path=”/” component={App}> <Route path=”cart” component={Cart}/> <Route path=”login” component={Login}/> <Route component={EnsureLoggedInContainer}> <Route path=”checkout” component={Checkout}/> <Route path=”account” component={Account}/> </Route> </Route> 

그리고이 "부모"의

는의 (EnsureLoggedInContainer) 구성 요소는 그런 짓을 렌더링 '도용 렌더링'이라고합니다. 당신은 그것에 대해 구글 수 있습니다. 이를 수행하는 가장 좋은 방법은'HOC'를 이용하는 것입니다. Readmore on it [here] (https://medium.com/@franleplant/react-higher-order-components-in-depth-cf9032ee6c3e). 일단 읽었 으면 어떤 문제가 있으면 우리에게로 돌아 가라. – Panther

답변

1

이 같은 RootComponent 체크인을 사용할 수 있습니다.

또는 PersonCreate 구성 요소에서 유사한 체크를 사용할 수 있습니다.

+0

인증 없이도 일부 라우트를 렌더링해야합니다. (예 : 로그인) 이미 시도했습니다. – Aris

+0

앞에서 언급했듯이,'PersonCreate' 나 다른 컴포넌트 내에서 그런 체크를 사용할 수 있습니다. – lunochkin

+0

그래도 좋은 해결책은 아닙니다. 수백 개의 구성 요소에서 동일한 논리를 복제 할 수 없습니다. – Aris