Se si vuole che si potrebbe scrivere route.js come questo:
var requireAuth = (store, nextState, replace) => {
console.log("store: ", store);
//now you have access to the store in the onEnter hook!
}
export default (store) => {
return (
<Route path="/" component={App}>
<IndexRoute component={Landing} />
<Route path="learn" component={Learn} />
<Route path="about" component={About} />
<Route path="downloads" component={Downloads} onEnter={requireAuth.bind(this, store)} />
</Route>
);
);
Ho installato un esempio che si potrebbe giocare con in questo codepen.
Non sono sicuro che l'attivazione di un'azione per gestire l'autenticazione sia una buona idea. Personalmente preferisco movimentazione autenticazione in modo diverso:
Invece di utilizzare un gancio onEnter
, io uso una funzione di avvolgimento. Voglio proteggere la sezione di amministrazione del mio blog, quindi ho avvolto il componente AdminContainer
nei percorsi con una funzione, requireAuthentication
, vedi sotto.
export default (store, history) => {
return (
<Router history={history}>
<Route path="/" component={App}>
{ /* Home (main) route */ }
<IndexRoute component={HomeContainer}/>
<Route path="post/:slug" component={PostPage}/>
{ /* <Route path="*" component={NotFound} status={404} /> */ }
</Route>
<Route path="/admin" component={requireAuthentication(AdminContainer)}>
<IndexRoute component={PostList}/>
<Route path=":slug/edit" component={PostEditor}/>
<Route path="add" component={PostEditor}/>
</Route>
<Route path="/login" component={Login}/>
</Router>
);
};
requireAuthentication
è una funzione che
- se l'utente è autenticato, rende il componente avvolto,
- reindirizza altrimenti
Login
Si può vedere qui sotto:
export default function requireAuthentication(Component) {
class AuthenticatedComponent extends React.Component {
componentWillMount() {
this.checkAuth();
}
componentWillReceiveProps (nextProps) {
this.checkAuth();
}
checkAuth() {
if (!this.props.isAuthenticated) {
let redirectAfterLogin = this.props.location.pathname;
this.context.router.replace({pathname: '/login', state: {redirectAfterLogin: redirectAfterLogin}});
}
}
render() {
return (
<div>
{this.props.isAuthenticated === true
? <Component {...this.props}/>
: null
}
</div>
)
}
}
const mapStateToProps = (state) => ({
isAuthenticated: state.blog.get('isAuthenticated')
});
AuthenticatedComponent.contextTypes = {
router: React.PropTypes.object.isRequired
};
return connect(mapStateToProps)(AuthenticatedComponent);
}
Inoltre, requireAuthentication
proteggerà tutti i percorsi sotto /admin
. E puoi riutilizzarlo dove vuoi.
fonte
2016-03-07 19:29:50
questo è un grande esempio. Grazie mille :) – shivam
Come funzionerebbe con il rendering dei server? – Enkay
TY un po ', questo approccio è davvero facile da attuare, ma ho bisogno di chiedere, c'è qualche problema con questo? – StormRage