StackNavigator против createStackNavigator

Я обновляю свое приложение с response-navigation 1.5 до 3.0.9. Я не понимаю, в чем разница в управлении состоянием компонентов, но я уверен, что они есть. Раньше это работало нормально, теперь ведет себя странно. Похоже, что состояние каким-то образом кэшируется, и, просматривая и возвращаясь к этому компоненту, state.params.letter остается прежним, даже когда мне это не нужно. Разве состояние не должно быть разрушено, если я изменю представление?

Компонент имеет очень простую логику, он показывает FlatList элементов. Если свойство letter присутствует, оно показывает только те элементы, которые начинаются с этой буквы.

export default class Search extends Component {
    constructor(props) {
        super(props);
    }
    DB = null;
    componentDidMount(){
        //check for the param "letter"
        let L = this.props.navigation.state.params ? this.props.navigation.state.params.letter : null;
        this.setState({
            DB: L ? this.DB.getStartWith(L) : this.DB.getAll()
        })
    }
    render() {
        const { params } = this.props.navigation.state;
        const { t, i18n, navigation } = this.props;


        return (
            <View>
                <FlatList data={this.state.DB}
                    renderItem=({item}) => <Text> {item} </Text>
                />
            </View>
        );
    }

}

person alfredopacino    schedule 25.02.2019    source источник


Ответы (1)


Как работает навигатор стека реакции-навигации, он хранит стек различных экранов, так что, когда вы нажимаете кнопку «Назад», он знает, какой экран вы последний раз посещали. Когда вы передаете параметр, как в вашем случае:

this.props.navigation.state.params.letter

Состояние сохраняется в ответном стеке навигации и будет оставаться там до тех пор, пока вы не «уничтожите» свой экран (например, вернетесь с этого экрана), например, если ваш стек выглядит так (screen1> search) и затем вы переходите к screen2, чтобы он стал (screen1> search> screen2) внутреннее состояние поискового компонента будет уничтожено, но не будет состоянием реагирования навигации, поэтому, если вы вернетесь назад, буква параметра будет то же самое, единственный способ уничтожить этот параметр - вернуться к screen1. Альтернативой является сохранение вашего буквенного параметра с использованием чего-то вроде redux, в общем, я стараюсь избегать передачи переменных с помощью параметров реакции-навигации, если только это не параметр, связанный с самой навигацией (например, параметры навигации).

person lamazing    schedule 25.02.2019