我一直在学习React Native with Expo . 决定使用小型双屏应用程序来理解“反应方式”,但我无法弄清楚如何在React中思考 .
我相信我不了解组件生命周期 . 在下面的示例代码中,我的控制台输出是:
-
主页渲染
-
Headers 渲染
-
home渲染(为什么home再次渲染?)
-
Headers 会收到道具
-
Headers 渲染
由于我的 Headers 是StackNavigator的自定义组件,我不能通过props(afaik?)将事件处理程序传递给它所以我必须在HomeScreen的componentDidMount / WillMount事件中进行setParams调用,但是当我这样做时,我的整个HomeScreen重新渲染本身就是为什么?
当我的HomeScreen中有一个可能显示100个项目的FlatListView时会发生什么 . 我的主屏幕及其所有的孩子将在一开始就重新渲染?
将道具传递给自定义导航 Headers 也是我不完全理解的另一件事 . 我不知道如何将屏幕特定的navigationOptions传递给我的自定义 Headers . 假如我决定在每个屏幕上传递"title"参数,如果我在路由上定义特定的navigationOptions属性,我的自定义标头不会获得这些参数 .
这是我的代码:
Router.js
export const RootStack = StackNavigator(
{
Home: { screen: HomeScreen }
},
{
navigationOptions: ({navigation}) =>
{
return { header: <MainHeader navigation={navigation} /> }
}
});
App.js
class App() {
render() {
return <RootStack />
}
}
HomeScreen.js
export default class HomeScreen extends React.Component {
constructor(props) {
super(props);
this.refCheck = "Home Screen";
}
componentDidMount() {
this.props.navigation.setParams({ onMenuClick: this._handleMenuClick });
}
_handleMenuClick = () => {
console.log("Handle menu click. - " + this.refCheck);
}
render() {
console.log("home render");
return (
<SafeAreaView style={styles.container}>
<Text>Home Screen</Text>
</SafeAreaView>
)
}
}
MainHeader.js
export default class MainHeader extends React.Component {
constructor(props) {
super(props);
}
componentWillReceiveProps(nextProps) {
console.log("header will receive props");
}
render() {
console.log("header render");
return (
<View style={styles.header}>
<Text>Menu</Text>
<Text>Logo</Text>
<Text>Search</Text>
</View>
)
}
}