2017-10-21 12 views
0

난 내가 하나 개의 루트 요소를 반환하지만, 다음과 같은 오류를 얻을 :Route.render() : 유효한는 요소 (또는 null) 반작용 반환해야합니다

Route.render을() : 유효한 반작용 요소 (또는 null)을 리턴해야합니다. 이 정의되지 않았거나 배열 또는 다른 잘못된 개체를 반환했을 수 있습니다.


파견 함수

하지

내 코드 :

export var PrivateRoute = ({ component: Component, ...rest }) => { 

    return (
    <Route {...rest} render={props => { 
    firebase.auth().onAuthStateChanged((user) => { 
     if(user) { 
     console.log('ON...ON'); 
     var {dispatch} = props; 
     dispatch(actions.login(user.uid)); 
     dispatch(actions.startAddTodos()); 
     return(
      <Component {...props} /> 
     ) ; 

     } else { 
     console.log('OFF...OFF'); 

     dispatch(actions.logout()); 

     return (
      <Redirect to={{ pathname: '/login', state: { from: props.location } }} /> 
     ); 

     } 
    }); 
    }} />); 
} 
export default Redux.connect()(PrivateRoute); 

Github Link

+0

수익은 비동기 콜백 내부 및 함수에 직접 반환'소품을 복용하지 그 '인수로 –

+0

@MohammadElbanna : 고마워, 문제의 해결책을 제안 해 줄 수 있겠 니? –

+0

나는 그것을 고치기위한 제안을 올렸다. 희망 그것이 작동합니다! –

답변

2

저는 주된 문제는 비동기 함수 내부에서 UI를 반환한다는 것입니다.

인증 작업이 완료 될 때까지 사용자에게 표시 할 항목이 isLoading이어야합니다. isLoading이 참일 때로드 표시기 을 표시해야합니다. 그렇지 않으면 인증 성공 또는 실패와 관련된 다른 구성 요소를 표시해야합니다.

인증 성공 또는 실패의 상태도 정의해야합니다.

: 나는 당신의 REDUX 상태 트리에 대해 잘 모르기 때문에 대신 돌아 오는의 구성 요소 상태 시스템을 반응 사용하는거야. 자유 전환을 Redux로 자유롭게 시도하십시오

먼저 라우팅 할 구성 요소를 별도의 클래스 구성 요소로 리팩터링해야합니다. 의는 구성 요소 UserAuth

class UserAuth extends Component { 
    state = { 
    isLoading: true 
    isUserAuth: false 
    } 

    componentDidMount() { 
    firebase.auth().onAuthStateChanged((user) => { 
     if(user) { 
     this.setState({isLoading: false, isUserAuth: true}) 
     // the rest of your logic here 
     } 
     else { 
     this.setState({isLoading: false, isUserAuth: false}) 
     // the rest of your logic here 
     } 
    } 

    render() { 
    return (
     {this.state.isLoading && <LoadingIndicator /> } 
     {!this.state.isLoading && this.state.isUserAuth && <Component {...this.props} />} 
     {!this.state.isLoading && !this.state.isUserAuth && <Redirect to={{ pathname: '/login', state: { from: this.props.location } }} />} 
    ); 

    } 
} 

이 두 번째로, 당신의 <Route> 구성 요소에 당신이 뭔가를해야한다고 부르 자 :

<Route {...rest} render={props => (<UserAuth {...props} />)} /> 
+0

ميرسي خالص يامحمد, أنا لسه جديد في الموضوع ففي حاجات كتير مش واضحة بالنسبالي, كنت بتمنى يكون التعديل على نفس المثال, لان ال '라우터 V4' مختلف تماما فحسب الاقتراحات اطلب اني اعمل '리디렉션 Component' في اللينك دا https://stackoverflow.com/a/46799951/418343 وحضرتك بتقولي اعمل 새로운 구성 요소! فانا شايف كدا الدنيا بتتقق. –

+1

العفو يا باشا .. انا حكمل انجلش عشان لو حد ممكن يستفيد بحاجة .. قول لي بس ايه اللي مش واضح وانا افهمك (내가 많이하지 않았다 는. 난 그냥 코드를 리팩토링 لو عارف يعني. 귀하의 코드가 리팩토링해야 왜냐하면 비동기 콜백에서 UI를 반환 할 수 없다고했기 때문입니다.당신은 즉석에서 구성 요소를 만들고 (그리고 속성을 렌더링하기 위해 전달합니다) 제가 한 것은 이름을 지정하고 코드를 리팩토링 한 것입니다. React.js 방식으로 항상 컴포넌트를 통해 재사용 가능한 코드를 생성합니다. 그리고 게시 한 링크의 PrivateRoute 구성 요소는 경로를 안전하게 유지하기위한 좋은 추상화입니다. –

+1

감사합니다 모하마드, 나는 그것을 시도 해줄거야 :) –