2016-12-25 3 views
2

Я работаю над проектом React Native, и я понял, что React Native, похоже, нарушает обновление реквизитов React flow (Parent to children).React Native не обновляет реквизиты дочерних компонентов

В принципе, я вызываю компонент «Меню» из компонента «Приложение», передавая подсказку «Меню». Однако, когда я обновляю состояние «App», реквизиты в «Меню» должны обновляться, но этого не происходит. Я делаю что-то неправильно?

Вот мой код:

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

@Codesingh да, вы можете установить состояние из 'cDM' метода. Вы не можете сделать это из метода render. – Andreyco

ответ

1

Реагировать не нарушает поток данных ... Вы. После инициализации начального состояния вы забыли обновить состояние меню позже, когда родитель отправит обновленные реквизиты.

Попробуйте это ...

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

Вы не можете обновить состояние, подобное этому, в файле isupdate – Codesingh

+0

Пожалуйста, почему вы так думаете? Это законный способ, не нарушает ничего и сохраняет вам другую повторную визуализацию. Присмотритесь к конструктору - состояние инициализируется из prop, переданного родителем. Я использовал тот же шаблон в методе 'componentWillUpdate'. Компонент * собирается обновить * (вы не можете предотвратить это), и состояние будет заменено измененным 'nextState'. – Andreyco

+0

Эй @ Андрико, ваше решение работает. Сначала спасибо за помощь. Итак, у меня есть вопрос, почему мне нужен компонентWillUpdate здесь, а не в приложении с чистым React? Я сделал пример с чистым React, и все отлично работает без компонента componentWillUpdate. –

Смежные вопросы