7

以下是在啓動React Native應用程序一段時間之後的Android日誌輸出,然後通過關閉Meteor服務器將其從Meteor(DDP)服務器斷開連接。react-native-router-flux警告:密鑰已被定義

使用console.log("<App /> render")表明何時App組件的render函數被調用,似乎只要render函數被再次調用後createContainer通過它的一些新props,該Key is already defined錯誤被觸發。

什麼原因導致此錯誤/警告,我們該如何解決?該應用程序仍然運行良好,但在這裏肯定是錯誤的。

12-23 02:27:01.875 31197 19338 I ReactNativeJS: Running application "RNapp" with appParams: {"initialProps":{},"rootTag" 
:1}. __DEV__ === true, development-level warning are ON, performance optimizations are OFF 
12-23 02:27:01.891 31197 19338 I ReactNativeJS: render 
12-23 02:27:01.995 31197 19338 I ReactNativeJS: Connected to DDP server. 
12-23 02:27:01.999 31197 19338 I ReactNativeJS: Connected to DDP server. 
12-23 02:27:02.012 31197 19338 I ReactNativeJS: render 
12-23 02:27:02.013 31197 19338 I ReactNativeJS: Key home is already defined! 
12-23 02:27:02.013 31197 19338 I ReactNativeJS: Key welcome is already defined! 
12-23 02:27:02.013 31197 19338 I ReactNativeJS: Key loading is already defined! 
12-23 02:27:02.013 31197 19338 I ReactNativeJS: Key root is already defined! 
12-23 02:27:34.592 31197 19338 I ReactNativeJS: Disconnected from DDP server. 
12-23 02:27:34.593 31197 19338 I ReactNativeJS: Disconnected from DDP server. 
12-23 02:27:34.599 31197 19338 I ReactNativeJS: <App /> render 
12-23 02:27:34.599 31197 19338 I ReactNativeJS: Key home is already defined! 
12-23 02:27:34.599 31197 19338 I ReactNativeJS: Key welcome is already defined! 
12-23 02:27:34.599 31197 19338 I ReactNativeJS: Key loading is already defined! 
12-23 02:27:34.599 31197 19338 I ReactNativeJS: Key root is already defined! 
12-23 02:27:34.609 31197 19338 I ReactNativeJS: <Loading /> render 
12-23 02:27:35.603 31197 19338 I ReactNativeJS: Disconnected from DDP server. 
12-23 02:27:35.613 31197 19338 I ReactNativeJS: <App /> render 
12-23 02:27:35.613 31197 19338 I ReactNativeJS: Key home is already defined! 
12-23 02:27:35.613 31197 19338 I ReactNativeJS: Key welcome is already defined! 
12-23 02:27:35.613 31197 19338 I ReactNativeJS: Key loading is already defined! 
12-23 02:27:35.613 31197 19338 I ReactNativeJS: Key root is already defined! 
12-23 02:27:45.599 31197 19338 I ReactNativeJS: Disconnected from DDP server. 
12-23 02:27:45.616 31197 19338 I ReactNativeJS: <App /> render 
12-23 02:27:45.616 31197 19338 I ReactNativeJS: Key home is already defined! 
12-23 02:27:45.616 31197 19338 I ReactNativeJS: Key welcome is already defined! 
12-23 02:27:45.616 31197 19338 I ReactNativeJS: Key loading is already defined! 
12-23 02:27:45.616 31197 19338 I ReactNativeJS: Key root is already defined! 

index.android.js

import { AppRegistry } from 'react-native' 

import App from './app/App.js' 

AppRegistry.registerComponent('RNapp',() => App) 

App組件

export class App extends Component { 

    constructor(props) { 
     super(props); 
    } 

    componentWillReceiveProps(nextProps) { 
     if (nextProps.status.connected == false) { 
      Actions.loading(); 
     } else { 
      if (nextProps.user !== null) { 
       Actions.home(); 
      } else { 
       Actions.welcome(); 
      } 
     } 
    } 


    render() { 
     console.log('<App /> render') 
     return (
      <Router> 
       <Scene key="root"> 
        <Scene key="home" component={Home} title="Home" hideNavBar={true} /> 
        <Scene key="welcome" component={Welcome} title="Welcome" hideNavBar={true} /> 
        <Scene key="loading" component={Loading} title="Loading" hideNavBar={true} /> 
        <Scene key="profile" component={Profile} title="Home" hideNavBar={true} /> 
        <Scene key="history" component={History} title="Home" hideNavBar={true} /> 
        <Scene key="search" component={Search} title="Home" hideNavBar={true} /> 
       </Scene> 
      </Router> 
     )  
    } 

} 


export default createContainer(() => { 
    return { 
    status: Meteor.status(), 
    user: Meteor.user(), 
    loggingIn: Meteor.loggingIn(), 
    }; 
}, App); 

回答

1

在我的經驗,警告不會引起任何問題,但爲了以防萬一,我一般定義一個shouldComponentUpdate方法,如果道具/狀態沒有以t的方式改變,則返回false帽子需要改變路線(注意,我使用了redux和redux來決定什麼是最初的場景,所以我需要將組件連接到redux以便通過道具獲取所需的信息,但是如果數據在商店更改,我可以安全地阻止其他渲染)。

這只是我的方法根據我的經驗和需求。路由器 - 通量傢伙有一個稍微「嚴格」的方法,你可以看到他們的docs

1

警告不會造成任何傷害,但你可以通過在變量中定義你的場景來擺脫它們,然後它們包含爲道具,以你的路由器,像這樣:

更多信息,請參見docs

+0

靜態場景沒有任何幫助。如果調用render,則路由器會重新渲染,導致生成警告消息,並且會重新渲染Scene層次結構中的初始組件。 –

相關問題