2016-05-30 61 views
0

我是新來的ReactJS,但我有一個簡單的用例:我有一個登錄表單,設置用戶的狀態(全名等),然後使用React路由器browserHistory.push('/')回到主頁。我可以確認,如果我留在我的狀態實際得到保存的登錄頁面上,但是當我回到主頁並進入我的「父」組件(App.js)並在呈現方法之前運行此操作時:爲什麼我會失去我的ReactJS狀態?

console.log(this.state) // this returns null

它總是返回true。我的構造函數甚至沒有對狀態做任何事情。如果我在App.js父組件的構造函數中放入一個日誌,我可以驗證該頁面是否實際上沒有被重新加載,組件是否只安裝一次(至少App.js上的構造函數在整個過程中只調用一次主頁>登錄>主頁生命週期)。再一次,該國似乎在更改頁面後被刪除。

我錯過了什麼簡單的東西?

編輯:一些代碼,試圖簡化它:

// LoginForm.js 
//Relevant method 
    handleSubmit() { 
    this.login(this.state.username, this.state.password, (success) => { 
     if (!success) 
     { 
     this.setState({ isLoggedIn: false }) 
     this.setState({ loginError: true }) 
     return 
     } 

     this.setState({ isLoggedIn: true }) 

     browserHistory.push('/') // I can verify it gets here and if at this point I console.log(this.isLoggedIn) I return true 
    }) 
    } 

    // App.js 
    class App extends React.Component { 

     constructor(props) { 
     super(props); 
     console.log('hello') 
     } 

     render() { 
     const { props } = this 
     console.log(this.state) // returns null 
    return (
    <div> 
     <AppBar style={{backgroundColor: '#455a64'}} 
       title="ADA Aware" 
       showMenuIconButton={false}> 
     <LoginBar/> 
     </AppBar> 
     <div> 
     {props.children} 
     </div> 
    </div> 
)} 
    //Part of my routes.js 
    export default (
     <Route path="/" component={App}> 
     <IndexRoute component={HomePage}/> 
     <Route path="/login" component={LoginForm}/> 
     <Route path="*" component={NotFoundPage}/> 
     </Route> 
    ); 
+1

如何共享代碼而不是試圖描述它? – naomik

+0

哪個狀態?我們在討論多少個組件?你如何更新它? (分享一些代碼!) – gravityplanx

+0

我添加了代碼,讓我知道如果這有幫助,試圖讓它到相關位 –

回答

0

當你打電話handleSubmit(),什麼組件調用呢? 如果是<LoginForm><LoginBar>或類似的東西,您的this.表示該組件,非<App>

要設置父的狀態(<App>你的情況),你應該傳遞給孩子一個屬性有一個處理函數(例如onLogin={this.handleAppLogin.bind(this)}),所以你的孩子必須把這個道具(this.props.onLogin(true))和處理器在<App>將設置應用程序的狀態: handleAppLogin(isLoggedIn) { this.setState({isLoggedIn}); }

但是對於「全局」狀態值,例如登錄狀態,訪問令牌,用戶名等,您最好使用Redux或其他Flux庫。

+0

{props.children} 這呈現子元素。我認爲全球元素確實需要一些其他的東西來處理它,因爲據我瞭解,國家不應該「向上」流向父母。 –

相關問題