# React Native筆記2 - 基礎
:::warning
4/3更新:
因為官網大更新,把教程全部翻新了(變更詳細&更清楚了),所以我重新讀完做了一個新版本 >>> [在這](https://hackmd.io/G2wCt4S-Qr6B6LzaW_G5nA?view)
:::
這篇筆記包含官方文檔的Learn the Basics, Props, State三個部分
# Part 1 - 基礎
[官方文檔 - Learn the Basics](https://facebook.github.io/react-native/docs/tutorial)
## 蓋出Hello, world!的程式:
```javascript
import React, { Component } from 'react';
import { Text, View } from 'react-native';
export default class HelloWorldApp extends Component {/*HelloWorldApp為Component的名字*/}
{
render()
{
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<Text>Hello, world!</Text>
</View>
);
}
}
```
### ES2015
**ES2015**(又稱**ES6**):Javascript的一種改良版本
React Native有兼容ES2015,包含```import```, ```from```, ```class```, ```extends```都是ES2015的功能
延伸閱讀:[ES2015功能](https://babeljs.io/docs/en/learn/) (之後有空我再讀xd)
### JSX
其中以下這段程式碼為 **JSX**,一種把XML嵌入Javascript的句法
```<Text>```: 文字
```<View>```: 類似html的 ```<div>``` 或 ```<span>```,用來裝其他component,可以用來統一控制樣式和版型
```javascript
<View><Text>Hello world!</Text></View>
```
### Component
上述程式碼就是寫了一個叫做HelloWorldApp的Component
所有在螢幕上看到的東西都是某種Component
一個Component可以非常簡單,但一定要有 ```render```方法 (把JSX return回去渲染)
----
# Part 2 - Props
[官方文檔 - Props](https://facebook.github.io/react-native/docs/props)
Props,即Properties的縮寫,是建立Components時的參數
ex. ```Image``` component的 ```source``` prop:控制顯示什麼圖片
在JSX中用大括號```{ }```把Javascript加進去~
```javascript
import React, { Component } from 'react';
import { Image } from 'react-native';
export default class Bananas extends Component {
render() {
let pic = {
uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg'
};
return ( //底下source是prop
<Image source={pic} style={{width: 193, height: 110}}/>
);
}
```
## 自定義Props
```javascript
import React, { Component } from 'react';
import { Text, View } from 'react-native';
class Greeting extends Component { {/*Greeting的component*/}
render() {
return (
<View style={{alignItems: 'center'}}>
<Text>Hello {this.props.name}!</Text>
</View>
);
}
}
export default class LotsOfGreetings extends Component {
render() {
return (
<View style={{alignItems: 'center', top: 50}}>
<Greeting name='Rexxar' /> {/*Greeting是Component名稱,name是prop*/}
<Greeting name='Jaina' />
<Greeting name='Valeera' />
</View>
);
}
}
```
用prop的方式使用```name```,讓我們可以客製化```Greeting```的Component
(可以重複使用Greeting,然後每次丟不同的參數(name)進去)
---
# Part 3 - State
[官方文檔 - State](https://facebook.github.io/react-native/docs/state)
一個Component由兩種資料控制:```props```和```state```
- ```props```:由parent設定,**固定不變**
- ```state```:**會變動**的資料
- 在constructor中初始化```state```
- 在想變更的時候呼叫```setState```
## 例子:用計時器來設定state的變動
- 文字的內容在一開始就會設定,所以是**prop**
- 文字關閉與開啟會變動,所以是**state**
```javascript
import React, { Component } from 'react';
import { Text, View } from 'react-native';
class Blink extends Component {
componentDidMount(){
// 設定state變更會發生什麼事 & 變更的時間間隔
setInterval(() => (
this.setState(previousState => (
{ isShowingText: !previousState.isShowingText }
))
), 1000); // 1000是時間間隔
}
//state object
state = { isShowingText: true };
render() {
if (!this.state.isShowingText) {
return null;
}
return (
<Text>{this.props.text}</Text>
);
}
}
export default class BlinkApp extends Component {
render() {
return (
<View>
<Blink text='I love to blink' />
<Blink text='Yes blinking is so great' />
<Blink text='Why did they ever take this out of HTML' />
<Blink text='Look at me look at me look at me' />
</View>
);
}
}
```
## 改變State的情況:
之後比起用計時器來變state,比較可能在**server傳新資料**或是**使用者輸入資料**的時候變state
這種時候推薦用state container來控制資料流動,如[Redux](https://redux.js.org/)和[Mobx](https://mobx.js.org/README.html),而不是直接呼叫```setState```
```setState```:被呼叫時會重新render他的Component
所以放在計時器裡面,就是每一個時間間隔重新render一次
更多關於處理state可以閱讀[React.Component API](https://reactjs.org/docs/react-component.html#setstate)
React Native的基本概念學完嘍!
[下一篇](https://hackmd.io/@charlo0602/BkbjkvQLU)筆記開始教排版