React Native开发React Native开发经验集

【RN】- 撸个登录页

2019-12-06  本文已影响0人  拔萝卜占坑

简介

React Native源码分析这篇文章算是学习RN跨平台开发的开始,文章简单对RN源码进行了分析,并实现了将RN使用在Fragment组件中。而这边文章算是自己写的第一个RN例子。

学习资源

React Native中文网
React Native官网例子

效果

ggggg.gif

实现

页面整体UI全都是RN提供的标准组件实现。弹框用的是Modal。这个可以去看一下官网的使用说明即可。唯一值得一说是RN手势的使用。

手势

  componentWillMount(){
    this._panResponder = PanResponder.create({
      // 单击手势是否可以成为响应者
      onStartShouldSetPanResponder:(evt,gs) => true,
      // 移动手势是否可以成为响应者
      onMoveShouldSetPanResponder:  (evt, gs) => true,
    // 与onStartShouldSetPanResponder相同,当此组件A里包含了子组件B也为触摸事件响应者时,若此时设为true,则父组件A优先级更高
      onStartShouldSetPanResponderCapture: (evt, gestureState) => {
        return false
      },
      // 拦截子组件的移动手势传递,是否拦截
      onMoveShouldSetPanResponderCapture: (evt, gs) => true,
      // 单击手势监听回调
      onPanResponderGrant: (evt, gs) => {
        console.log(`onPanResponderGrant call: gs=` ,gs);
        l = this.state.lastMarginLeft + gs.dx;
        l = l <= 22 ? 22 : l;
        this.setState({
          marginLeft:l,
        })
      },
      // 手势申请失败,未成为响应者的回调
      onResponderReject: (e) => {
        // 申请失败,其他组件未释放响应者
        console.log('onResponderReject==>' + '响应者申请失败')
      },
      // 移动手势监听回调
      onPanResponderMove: (evt, gs) => {
        console.log(`gs.X : ${gs.dx}   Y : ${gs.dy}`);
        l = this.state.lastMarginLeft + gs.dx;
        l = l <= 22 ? 22 : l;
        max = Dimensions.get('screen').width * 0.8 - 22 - 97;
        l = l >= max ? max : l;

        v = (l >= (Dimensions.get('screen').width * 0.8 - 23 - 97)) ? true : false;
        if (v) {
          ToastAndroid.show("验证成功!",ToastAndroid.SHORT);
        }

        this.setState({
          marginLeft:l,
          defaultAnimationModal:!v
        })
      },
      //手势开始
      onPanResponderStart:(evt, gs) => {

      },
      // 手势动作结束回调
      onPanResponderEnd: (evt, gs) => {
        console.log(`onPanResponderEnd call: gs=` ,gs);
        this.setState({
          lastMarginLeft: this.state.marginLeft,
        })
      },
      // 手势释放, 响应者释放回调
      onPanResponderRelease: (evt, gs) => {
        console.log(`onPanResponderRelease call: gs=` ,gs);
      },
       // 当前手势被强制取消的回调
      onPanResponderTerminate: (evt, gs) => {
        console.log(`onPanResponderTerminate call: gs=` ,gs);
      },
      // 其他的东西想成为响应器。这种视图应该释放应答吗?返回 true 就是允许释放 
      onPanResponderTerminationRequest:(evt, gs) => {
        console.log(`onPanResponderTerminationRequest call: gs=` ,gs);
        // 如果返回true,Modal里面的手势不能正常使用
        return false;
      },
      onShouldBlockNativeResponder: (evt, gs) => {
        console.log(`onShouldBlockNativeResponder call: gs=` ,gs);
        // 返回一个布尔值,决定当前组件是否应该阻止原生组件成为JS响应者
        // 默认返回true。目前暂时只支持android。
        return true;
      },
    })
  }

遇到的问题

上一篇 下一篇

猜你喜欢

热点阅读