React Native 导航(Navigator)详解——实例二
来源:互联网 发布:淘宝彩妆店铺介绍 编辑:程序博客网 时间:2024/06/05 16:35
这个例子主要是展示页面间的参数传递,以及简要说明ES6的新语法的使用。分为两个页面:注册页、设置初始密码页。操作流程是:在注册页输入名字 》点击提交,把输入的名字传到第二页设置初始密码页 》在初始密码页显示姓名,并点击初始化密码按钮设置初始密码 》把初始化密码传入到第一页注册页 》隐藏注册框和按钮,显示名字和密码,并修改页面标题。效果图如下:
代码分为三部分,index.js、registerFirst.js、registerSecond.js,index作为导航页面的主入口,用于加载页面。registerFirst为第一页,registerSecond为第二页。要了解的知识有React(React Native是基于React.js)的state属性、props属性,以及state和props用法上的区别;ES6新增语法的使用;下面对关键代码进行说明:
1》index.js导航入口页
源码分析:
import registerFirst from './registerFirst';
引入注册页面,注册页面定义为一个Component组件,通过import引入进来。用法和代码前两句是一模一样的,加载模块。
const defaultRoute = {component: registerFirst};
定义静态常量defaultRoute,定义的component对象就是第一个页面registerFirst。
initialRoute={defaultRoute}
初始化路由,显示的第一个页面
configureScene={(route, routeStack) => Navigator.SceneConfigs.HorizontalSwipeJump }
定义页面切换动画
renderScene={(route, navigator) => {<span style="white-space:pre"></span>let Component = route.component;<span style="white-space:pre"></span>return (<span style="white-space:pre"></span><Component {...route.params} navigator={navigator} /><span style="white-space:pre"></span>);}}
定义页面渲染,传入的两个参数route和navigator,route就是initialRoute里面的那个路由(页面),navigator就是当前的navigator对象。
let Component = route.component;
在路由中取出component对象,let是ES6新增数据类型,用法和var一样,区别是var会带来变量作用域提升,并且通过var对象定义的this会脱离定义时环境而指向运行时的环境,详细语法说明和示例可以参看http://es6.ruanyifeng.com/
<Component {...route.params} navigator={navigator} />
这句代码非常关键,对于新手来说也非常难以理解。
ES6引入rest参数(形式为“...变量名”),用于获取函数的多余参数。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中;和扩展运算符(spread)是三个点(...)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。
rest例子
function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum;}add(2, 5, 3) // 10
spread 例子
console.log(...[1,2,3])//1,2,3
先不要管route.params从哪来,看下面的例子:
let params = {a:1, b:2};return ( <Component {...params} navigator={navigator} />);
等同于
return ( <Component a={1} b={2} navigator={navigator} />);
看这个你就可以看明白了吧,上边的{...params}就是把参数对象所有属性都转化成为组件的props属性,组件就可以获得传递过来的参数,完成参数传递的过程。Route.params的定义在第一个页面注册页
let scenes = { component: registerSecond, params: { name: _this.state.name, setPassword: (password)=> { _this.setState({password: password}); } }};
2》registerFirst.js注册页面
源码分析:
this.state = { name: null }
初始化state的name变量
let _this = this;
ES6语法,let拿到this指引,并在当前{}内锁定对象引用
const {navigator} = this.props;
ES6语法,对象的解构赋值
var { foo, bar } = { foo: "aaa", bar: "bbb" };foo // "aaa"bar // "bbb"
此处navigator就是拿到组件props中的Navigator对象,定义处在index.js的
<Component {...route.params} navigator={navigator} />
params: { name: _this.state.name, setPassword: (password)=> { _this.setState({password: password}); } }
定义params参数,进行页面间的参数传递。此处的_this不能用this代替(查看ES6中let用法),params里面定义的属性和方法都会变为组件的props属性,进行传递。
navigator.push(scenes);
添加第二个页面,设置初始化密码页面
if (this.state.password) { ... } else { ... }
这里面做了个判断,通过是否有password值来显示不同的view
onChangeText={name => this.setState({ name })}/>
监听输入框值的变化动态修改state里面的name值
<TouchableOpacity style={styles.btn} onPress={this._push.bind(this)}>
这里的bind(this)是必要的,绑定this到当前方法上
3》registerSecond.js设置初始化密码
componentDidMount() { this.setState({ name: this.props.name }); }
React 组件生命周期
组件的生命周期可分成三个状态:
· Mounting:已插入真实 DOM
· Updating:正在被重新渲染
· Unmounting:已移出真实 DOM
生命周期的方法有:
componentWillMount 在渲染前调用,在客户端也在服务端。
componentDidMount : 在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。 如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异部操作阻塞UI)。
componentWillReceiveProps 在组件接收到一个新的prop时被调用。这个方法在初始化render时不会被调用。
shouldComponentUpdate 返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。
可以在你确认不需要更新组件时使用。
componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。
componentDidUpdate 在组件完成更新后立即调用。在初始化时不会被调用。
componentWillUnmount在组件从 DOM 中移除的时候立刻被调用。
——来自http://www.runoob.com/react/react-component-life-cycle.html
this.setState({ name: this.props.name });
接收组件的props中的name参数,并设置为state中的name值
- React Native 导航(Navigator)详解——实例二
- React Native 导航(Navigator)详解——实例一
- React Native 导航(Navigator)详解——属性篇
- React Native 导航(Navigator)详解——方法篇
- React—native 之 Navigator (导航路由)组件
- React Native之导航器Navigator实现导航功能(二)
- 辣子鸡一步一爪印react native——导航TabNavigator,react-native-tab-navigator
- React-native Navigator导航跳转
- [React Native]导航器Navigator
- React Native Android(二)Navigator知识点
- React Native的Navigator详解
- React Native的Navigator详解
- React Native的Navigator详解
- React Native的Navigator详解
- React Native导航Navigator组件基本使用方法
- React Native导航Navigator组件基本使用方法
- React Native 的 Navigator 组件(导航功能)
- react native android使用react-native-tab-navigator来做底部导航tabbar(1)
- paas平台之代码构建(一)
- maven教程(四):maven依赖管理
- c/c++ 入门之控制台上实现贪吃蛇
- XShell 中回车出现^H的问题
- ROS Learning-018 Arduino-For-ROS-003 (总结篇) 模板程序 即 如何运行
- React Native 导航(Navigator)详解——实例二
- 二进制十六进制转十进制基础.
- JPA在分页中应用总结
- mysql数据库操作
- Git的基本使用
- 重装windows后移植jdk和Android Studio
- 装Ubuntu中遇到的一个坑
- Kafka与logstash数据交互
- codeforces 166E Tetrahedron 数学题