mirror of
https://github.com/status-im/react-navigation.git
synced 2025-02-25 01:28:16 +00:00
Add 'save-pattern' to docs (#2806)
* Add save-pattern to docs, #145 * Sync style * Language clarity * Typo
This commit is contained in:
parent
2ee85482ba
commit
4df002daab
@ -58,15 +58,15 @@ The navigation options can be defined with a [navigation prop](/docs/navigators/
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
static navigationOptions = ({ navigation }) => {
|
static navigationOptions = ({ navigation }) => {
|
||||||
const {state, setParams} = navigation;
|
const { state, setParams } = navigation;
|
||||||
const isInfo = state.params.mode === 'info';
|
const isInfo = state.params.mode === 'info';
|
||||||
const {user} = state.params;
|
const { user } = state.params;
|
||||||
return {
|
return {
|
||||||
title: isInfo ? `${user}'s Contact Info` : `Chat with ${state.params.user}`,
|
title: isInfo ? `${user}'s Contact Info` : `Chat with ${state.params.user}`,
|
||||||
headerRight: (
|
headerRight: (
|
||||||
<Button
|
<Button
|
||||||
title={isInfo ? 'Done' : `${user}'s info`}
|
title={isInfo ? 'Done' : `${user}'s info`}
|
||||||
onPress={() => setParams({ mode: isInfo ? 'none' : 'info'})}
|
onPress={() => setParams({ mode: isInfo ? 'none' : 'info' })}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
@ -79,4 +79,60 @@ Now, the header can interact with the screen route/state:
|
|||||||
header-interaction
|
header-interaction
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Header interaction with screen component
|
||||||
|
|
||||||
|
Sometimes it is necessary for the header to access properties of the screen component such as functions or state.
|
||||||
|
|
||||||
|
Let's say we want to create an 'edit contact info' screen with a save button in the header. We want the save button to be replaced by an `ActivityIndicator` while saving.
|
||||||
|
|
||||||
|
```js
|
||||||
|
class EditInfoScreen extends React.Component {
|
||||||
|
static navigationOptions = ({ navigation }) => {
|
||||||
|
const { params = {} } = navigation.state;
|
||||||
|
let headerRight = (
|
||||||
|
<Button
|
||||||
|
title="Save"
|
||||||
|
onPress={params.handleSave ? params.handleSave : () => null}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
if (params.isSaving) {
|
||||||
|
headerRight = <ActivityIndicator />;
|
||||||
|
}
|
||||||
|
return { headerRight };
|
||||||
|
};
|
||||||
|
|
||||||
|
state = {
|
||||||
|
nickname: 'Lucy jacuzzi'
|
||||||
|
}
|
||||||
|
|
||||||
|
_handleSave = () => {
|
||||||
|
// Update state, show ActivityIndicator
|
||||||
|
this.props.navigation.setParams({ isSaving: true });
|
||||||
|
|
||||||
|
// Fictional function to save information in a store somewhere
|
||||||
|
saveInfo().then(() => {
|
||||||
|
this.props.navigation.setParams({ isSaving: false});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
// We can only set the function after the component has been initialized
|
||||||
|
this.props.navigation.setParams({ handleSave: this._handleSave });
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<TextInput
|
||||||
|
onChangeText={(nickname) => this.setState({ nickname })}
|
||||||
|
placeholder={'Nickname'}
|
||||||
|
value={this.state.nickname}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note**: Since the `handleSave`-param is only set on component mount it is not immidiately available in the `navigationOptions`-function. Before `handleSave` is set we pass down an empty function to the `Button`-component in order to make it render immidiately and avoid flickering.
|
||||||
|
|
||||||
|
|
||||||
To see the rest of the header options, see the [navigation options document](/docs/navigators/navigation-options#Stack-Navigation-Options).
|
To see the rest of the header options, see the [navigation options document](/docs/navigators/navigation-options#Stack-Navigation-Options).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user