写多了taro, 看见react native中的组件好亲切啊,几乎一模一样。
一、函数式组件 --- 常用
1)无状态,每次刷新都是生成一个新的状态
2)基于状态变化的管理
3)简洁,代码少,易于服用
javascript
import React from "react";
import { View, Text } from 'react-native';
// 子组件 TestFunctionDemo.js
export default function TestFunctionDemo(props) {
const { name, info: {age, sex} } = props
const [address, setAddress] = useState('中国')
useEffect(() => {
// 第一次加载完成
setTimeout(() => {
setAddress('大陆')
}, 2000)
}, [])
useEffect(() => {
// 监听address
}, [address])
return (
<View style={{height: 200, width: '80%', padding: 20, borderRadius: 10, backgroundColor: '#ccc'}}>
<Text>我是子组件</Text>
<Text>姓名:{ name }</Text>
<Text>年龄:{ age }</Text>
<Text>性别:{ sex }</Text>
<Text>{`地址:${ address }`}</Text>
{ props.children}
</View>
)
}
// 简写
const TestFunctionDemo = (props) => {
// ...
}
export default TestFunctionDemo
// 或
export default (props) => {
// ...
}
二、class组件
1) 有状态state, 每次都是修改的同一个状态
2) 基于生命周期的管理
javascript
// 子组件 TestClassDemo .js
class TestClassDemo extends React.Component {
constructor(props) {
super(props)
this.state = {
address: '中国'
}
}
componentDidMount() {
setTimeout(() => {
this.setState({
address: '大陆'
})
}, 2000)
}
render() {
const { name, info: {age, sex} } = this.props
const { address } = this.state
return (
<View style={{height: 200, width: '80%', padding: 20, borderRadius: 10, backgroundColor: '#ccc'}}>
<Text>我是子组件</Text>
<Text>姓名:{ name }</Text>
<Text>年龄:{ age }</Text>
<Text>性别:{ sex }</Text>
<Text>{`地址:${ address }`}</Text>
{ this.props.children}
</View>
)
}
}
export default TestClassDemo
三、父组件引入
javascript
// 父组件app.js中引入
import TestFunctionDemo from './src/components/TestFunctionDemo';
import TestClassDemofrom './src/components/TestClassDemo';
// ...
const info = {
age: 20,
sex: 'nan'
}
// ...
<TestFunctionDemo
name="zhangsan"
info={info}>
<Text>我是通过插槽加入的!</Text>
</TestFunctionDemo>
<TestClassDemo
name="zhangsan"
info={info}>
<Text>我是通过插槽加入的!</Text>
</TestClassDemo>

以上是不是和react一模一样
四、样式
!!!这里和react不一样
javascript
import React from "react";
import { View, Text, StyleSheet } from 'react-native';
// 子组件 TestFunctionDemo.js
export default (props) => {
// ...
return (
<View style={styles.box}>
// 多个样式用数组
<Text style={[styles.textLine, styles.title]}>我是子组件</Text>
<Text style={styles.textLine}>姓名:{ name }</Text>
// ...
</View>
)
}
// 样式
const styles = StyleSheet.create({
box: {
height: 200,
width: '80%',
padding: 20,
borderRadius: 10,
backgroundColor: '#ccc'
},
textLine: {
fontSize: 18,
color: 'blue'
},
title: {
fontWeight: "bold"
}
})
