76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Component State
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								## Component State
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In `Class` components, there is a way to store and manage state built in to React Native.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								class App extends Component {
							 | 
						||
| 
								 | 
							
								  constructor () {
							 | 
						||
| 
								 | 
							
								    super();
							 | 
						||
| 
								 | 
							
								    this.state = {
							 | 
						||
| 
								 | 
							
								      counter: 0
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  incrementCount () {
							 | 
						||
| 
								 | 
							
								    this.setState({
							 | 
						||
| 
								 | 
							
								      counter: this.state.counter + 1
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  decrementCount () {
							 | 
						||
| 
								 | 
							
								    this.setState({
							 | 
						||
| 
								 | 
							
								      counter: this.state.counter - 1
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  render () {
							 | 
						||
| 
								 | 
							
								    return (
							 | 
						||
| 
								 | 
							
								      <View>
							 | 
						||
| 
								 | 
							
								        <Text>Count: {this.state.counter}</Text>
							 | 
						||
| 
								 | 
							
								        <Button onPress={this.decrementCount.bind(this)}>-</Button>
							 | 
						||
| 
								 | 
							
								        <Button onPress={this.incrementCount.bind(this)}>+</Button>
							 | 
						||
| 
								 | 
							
								      </View>
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								State is similar to props, but it is private and fully controlled by the component. Here, the `constructor()` method is calling the parent class' constructor with `super();` - **`Component`** is the parent class of `App` because we are using the `extends` keyword. The `constructor()` method also initializes the component's state object:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								this.state = {
							 | 
						||
| 
								 | 
							
								  counter: 0
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The state can be displayed within the component:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								{this.state.counter}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Or updated by calling:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								this.setState({});
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Note:** Aside from its initial creation in your component's `constructor()` method, you should never directly modify the component's state with `this.state = `. You must use `this.setState` as can be seen in the `incrementCount` and `decrementCount` functions above.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The count is incremented and decremented by calling the functions passed to the `onPress` handlers just like they would be if you called a click handler from JavaScript on the web.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*ASIDE: In the first example, `<Button>` is a custom component; it's a combination of `<TouchableOpacity>` and `<Text>` from the React Native API:*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								const Button = ({ onPress, children, buttonProps, textProps }) => {
							 | 
						||
| 
								 | 
							
								  const { buttonStyle, textStyle } = styles;
							 | 
						||
| 
								 | 
							
								  return (
							 | 
						||
| 
								 | 
							
								    <TouchableOpacity onPress={onPress} style={[buttonStyle, buttonProps]}>
							 | 
						||
| 
								 | 
							
								      <Text style={[textStyle, textProps]}>
							 | 
						||
| 
								 | 
							
								        {children}
							 | 
						||
| 
								 | 
							
								      </Text>
							 | 
						||
| 
								 | 
							
								    </TouchableOpacity>
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								```
							 |