2016-12-25 22 views
2

React Nativeプロジェクトで作業していて、React NativeがReact flow(親から子へ)の小道具の更新を破っているようです。React Nativeが子コンポーネントの小道具を更新しない

基本的には、「App」コンポーネントから「Menu」コンポーネントを呼び出し、「Menu」に小道具を渡します。しかし、「App」状態を更新すると、「Menu」の小道具が更新されますが、これは起こりません。私は何か間違っているのですか?私のコードです

App.js

import React from 'react'; 
import { 
View, 
Text 
} from 'react-native'; 

import Menu from './Menu'; 

class App extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     opacity: 2 
    } 
    } 

    componentDidMount() { 
    setTimeout(() => { 
     this.setState({ 
     opacity: 4 
     }); 
    }, 3000); 
    } 

    render() { 
    return(
     <View> 
     <Menu propOpacity={this.state.opacity} /> 
     </View> 
    ); 
    } 
} 

export default App; 

Menu.js

import React from 'react'; 
import { 
View, 
Text 
} from 'react-native'; 

class Menu extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     menuOpacity: props.propOpacity 
    } 
    } 

    render() { 
    return(
     <View> 
     <Text>Menu opacity: {this.state.menuOpacity}</Text> 
     </View> 
    ); 
    } 
} 

Menu.propTypes = { 
    propOpacity: React.PropTypes.number 
} 

Menu.defaultProps = { 
    propOpacity: 1 
} 

export default Menu; 
+0

あなたはどこか別の場所にそうピーズ更新、didmount内の状態を設定することはできません。 – Codesingh

+0

@コード化はい、 'cDM'メソッドから状態を設定できます。 'render'メソッドからはそうすることはできません。 – Andreyco

答えて

1

は、データフローを...あなたがされて破壊されていない反応します。初期状態の初期化の後、親が更新された小道具を送信した後、Menuの状態を後で更新することを忘れてしまいます。

これを試してみてください

...

class Menu extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     menuOpacity: props.propOpacity 
    } 
    } 

    componentWillUpdate(nextProps, nextState) { 
     nextState.menuOpacity = nextProps.propOpacity; 
    } 

    render() { 
    return(
     <View> 
     <Text>Menu opacity: {this.state.menuOpacity}</Text> 
     </View> 
    ); 
    } 
} 
+0

willupdateの内部でこのような状態を更新することはできません – Codesingh

+0

どうしてそうだと思いますか?それは正当な方法であり、物を壊すことはありませんし、別の再レンダリングを保存します。コンストラクタを詳しく見てください - 状態は親が渡した小道具から初期化されます。私は 'componentWillUpdate'メソッドで非常に同じパターンを使用しました。コンポーネント*は更新しようとしています*(あなたはこれを防ぐことはできません)、状態は変更された 'nextState'に置き換えられます。 – Andreyco

+0

ちょっと@Andreyco、あなたのソリューションが動作します。最初は、助けてくれてありがとう。ですから、純粋なReactアプリケーションではなく、なぜここでcomponentWillUpdateが必要なのかという疑問があります。私は純粋なReactのサンプルを作成しましたが、componentWillUpdateを使わないとうまく動作します。 –

関連する問題