React-Native 导航-3

上一节讲到name="Home"可以指定页面的标题。现在还有一种方式:

screenOptions好像是可以统一样式

先看下一个Context

我们用props传递数据,只能一层一层传输,用Context可以替换这种方法,有点全局变量的意思

import * as React from 'react';
import { Button, View,Text} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
 

export default class App extends React.Component {
  render() {
    return <Toolbar theme="dark" />;
  }
}

function Toolbar(props) {
  return (
    <View>
      <ThemedButton theme={props.theme} />
    </View>
  );
}

class ThemedButton extends React.Component {
  render() {
    return <Button title={this.props.theme} />;
  }
}

theme属性,传递给Toolbar,又传递给Button的title,如下

使用Context改写上面的例子

import * as React from 'react';
import { Button, View,Text} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
 
const ThemeContext = React.createContext();

export default class App extends React.Component {
  render() {
    return <ThemeContext.Provider value="light"><Toolbar/></ThemeContext.Provider>;
  }
}

function Toolbar(props) {
  return (
    <View>
      <ThemedButton />
    </View>
  );
}

class ThemedButton extends React.Component {
  static contextType=ThemeContext;
  render() {
    return <Button title={this.context} />;
  }
}

我们所做的是:

1.声明一个全局的上下文变量const ThemeContext = React.createContext();

2.在变量的入口,也就是App组件,用ThemeContext.Provider包裹组件,value的值就是需要传入的参数的值

3.利用this.context获取最近的由context设置的属性

我们将组件Toolbar中的ThemedButton也用ThemeContext.Provider包裹,看看最后按钮的值是什么

结果是more light

Toolbar中显示这个this.context,结果会怎么样

import * as React from 'react';
import { Button, View,Text} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
 
const ThemeContext = React.createContext();

export default class App extends React.Component {
  render() {
    return <ThemeContext.Provider value="light"><Toolbar/></ThemeContext.Provider>;
  }
}

class Toolbar extends React.Component{
  static contextType=ThemeContext;
  render(){
  return (
    <View>
    <ThemeContext.Provider value="more light">
      <Text>{this.context}</Text>
      <ThemedButton />
      </ThemeContext.Provider>
    </View>
  );}
}

class ThemedButton extends React.Component {
  static contextType=ThemeContext;
  render() {
    return <Button title={this.context} />;
  }
}

这里有一个东西 static contextType=ThemeContext;

contextType是一个静态属性,也就是类的属性,我这篇文章JavaScript-静态属性和静态方法讲过用法

(这时我自己写的,说实话,这几天不用又忘了,跟没学一样)

那么我们将上面的context,修改为组件组合试试

import * as React from 'react';
import { Button, View,Text} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
export default class App extends React.Component {
  render() {
  return (
    <Toolbar>
      <ThemedButton title="light"/>
    </Toolbar>
);}}

function Toolbar(props) {
  return (
    <View>
      {props.children}
    </View>
  );
}

function ThemedButton(props) {
    return <Button title={props.title} />
}

看过来就是 App组件跳过了Toolbar,将参数直接传递给了ThemedButton

接下来往下看

 把组件作为属性传入,仿造着改写一下,(虽然不知道是不是这个意思)

import * as React from 'react';
import { Button, View,Text} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
export default class App extends React.Component {
  render() {
  const themedButton=<ThemedButton title='light'/>;
  return (
    <Toolbar themedButton={themedButton}>
    </Toolbar>
);}}

function Toolbar(props) {
  return (
    <View>
      {props.themedButton}
    </View>
  );
}

function ThemedButton(props) {
    return <Button title={props.title} />
}

可能层数不够,体现不出来组合组件的优势

接下来看看动态Context/

 

后面的不想看了,前端工作太难找了,我要去学后端去了

下面是contenxt 和react native navigation的学习链接:

https://zh-hans.reactjs.org/docs/context.html

https://reactnavigation.org/docs/hello-react-navigation#passing-additional-props

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值