0.55 reactnative

2018-11-13 09:40:22 weixin_33826609 阅读数 48
  • 卷积神经网络:网络架构

    1.熟悉Flink大数据生态圈以及未来发展趋势 2.快速上手开发Flink批处理程序和流处理程序 3.掌握了Flink核心知识与编程模型,深入理解Flink计算框架 4.掌握了Flink HA分布式集群安装部署

    164人学习 白勇
    免费试看

当前项目react-native的版本是0.53.3,因为最近在做一系列性能优化的工作,于是计划升级一下RN的版本,升级至0.56.0。 先看一下ReactNative0.56.0版本更新的内容: github.com/react-nativ… 中文版:[0.56] React Native 中文更新日志 步骤及遇到的问题如下:

1.使用https://reactnative.cn/docs/upgrading/中基于Git的自动合并更新方式:

首先全局安装react-native-git-upgrade工具模块:

$ npm install -g react-native-git-upgrade
复制代码

2.接下来进行更新操作

$ react-native-git-upgrade
# 这样会直接把react native升级到最新版本

# 或者是:

$ react-native-git-upgrade X.Y.Z
# 这样把react native升级到指定的X.Y.Z版本
复制代码

那么更新到0.56.0就是

$ react-naitve-git-update 0.56.0
复制代码

3.等待升级结束后,需要解决冲突, 下面的这些文件的冲突都需要进行解决一下

文件中的冲突会以分隔线隔开,并清楚的标记出处,例如下面这样:

13B07F951A680F5B00A75B9A /* Release */ = {
  isa = XCBuildConfiguration;
  buildSettings = {
    ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
<<<<<<< ours
    CODE_SIGN_IDENTITY = "iPhone Developer";
    FRAMEWORK_SEARCH_PATHS = (
      "$(inherited)",
      "$(PROJECT_DIR)/HockeySDK.embeddedframework",
      "$(PROJECT_DIR)/HockeySDK-iOS/HockeySDK.embeddedframework",
    );
=======
    CURRENT_PROJECT_VERSION = 1;
>>>>>>> theirs
    HEADER_SEARCH_PATHS = (
      "$(inherited)",
      /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
      "$(SRCROOT)/../node_modules/react-native/React/**",
      "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**",
    );
上面代码中的"ours"表示你自己的代码,而"theirs"表示 React Native 的官方代码。然后你可以根据实际情况判断,选择某一方晋级,另一方出局。
复制代码

注意问题

一、0.56.0以上的RN使用Babel 7

React Native now uses Babel 7 When upgrading to 0.56, make sure to bump your babel-preset-react-native package.json dependency to 5.0.2 or newer (but still as fixed value). React Native 现在使用 Babel 7,升级到 0.56 后,请确保将 babel-preset-react-native package.json 依赖项升级到 ^5.0.2 或更高版本。 那么就需要升级一下babel-preset-react-native版本

yarn add babel-preset-react-native@5.0.2 --dev
复制代码

二、升级后遇到react native version mismatch问题

参考了https://stackoverflow.com/questions/47763824/react-native-version-mismatch中的解决方案: 1.IOS 进入项目中:

cd ios && pod install
复制代码
For others with the same problem on iOS with CocoaPods:

I tried all of the solutions above, without luck. I have some packages with native dependencies in my project, and some of those needed pod modules being installed. The problem was that React was specified in my Podfile, but the React pod didn't automatically get upgraded by using react-native-git-upgrade.

The fix is to upgrade all installed pods, by running cd ios && pod install.
复制代码

2.Android

第三方库使用的buildToolsVersion版本太低,不需要手动修改库内容,在android/build.gradle中添加以下内容,强制所有依赖使用相同版本。

subprojects {
   afterEvaluate {project ->
       if (project.hasProperty("android")) {
           android {
               compileSdkVersion 26
               buildToolsVersion '26.0.3'
           }
       }
   }
}
复制代码

其他升级问题可参考这篇文章,也可在评论区与我进行沟通。

ReactNative从0.47 升级到0.56遇到的问题

转载于:https://juejin.im/post/5bea9bd3518825271b3d6c16

2018-06-30 18:03:45 problc 阅读数 541
  • 卷积神经网络:网络架构

    1.熟悉Flink大数据生态圈以及未来发展趋势 2.快速上手开发Flink批处理程序和流处理程序 3.掌握了Flink核心知识与编程模型,深入理解Flink计算框架 4.掌握了Flink HA分布式集群安装部署

    164人学习 白勇
    免费试看

之前配置过RN,但是新版本有些东西变了。重新配置了一下,记录一下过程

ref:

https://facebook.github.io/react-native/docs/integration-with-existing-apps

https://www.jianshu.com/p/a133d7e45aed

https://www.jianshu.com/p/284e05eba766


1、创建xcode project


2、pod init
platform :ios, '9.0'
target 'RNDemo' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!
  platform :ios, '9.0'
  # Pods for RNDemo
  # Your 'node_modules' directory is probably in the root of your project,
  # but if not, adjust the `:path` accordingly
  pod 'React', :path => 'RNComponent/node_modules/react-native', :subspecs => [
    'Core',
    'CxxBridge', # Include this for RN >= 0.47
    'DevSupport', # Include this to enable In-App Devmenu if RN >= 0.43
    'RCTText',
    'RCTNetwork',
    'RCTWebSocket', # Needed for debugging
    'RCTAnimation', # Needed for FlatList and animations running on native UI thread
    # Add any other subspecs you want to use in your project
  ]
  # Explicitly include Yoga if you are using RN >= 0.42.0
  pod 'yoga', :path => 'RNComponent/node_modules/react-native/ReactCommon/yoga'
end


3、创建RNComponent目录
cd RNComponent


4、初始化node_modules
brew install yarn
yarn add react-native

yarn add react@16.3.1


{
"dependencies": {
"react": "16.3.1",
"react-native": "^0.55.4"
}
}


创建index.ios.js文件
import React from 'react';
import {AppRegistry, StyleSheet, Text, View} from 'react-native';


class RNHighScores extends React.Component {
  render() {
    var contents = this.props['scores'].map((score) => (
      <Text key={score.name}>
        {score.name}:{score.value}
        {'\n'}
      </Text>
    ));
    return (
      <View style={styles.container}>
        <Text style={styles.highScoresTitle}>2048 High Scores!</Text>
        <Text style={styles.scores}>{contents}</Text>
      </View>
    );
  }
}


const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#FFFFFF',
  },
  highScoresTitle: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  scores: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});


// Module name
AppRegistry.registerComponent('RNHighScores', () => RNHighScores);


5、pod install创建workspace
sudo xcode-select --switch /Applications/Xcode.app
xcrun -k --sdk iphoneos --show-sdk-path
pod install


6、启动react-native
yarn global add react-native-cli
react-native start

这样http://localhost:8081/index.ios.bundle?platform=ios 就可以访问了


7、配置NSTemporaryExceptionAllowsInsecureHTTPLoads

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>


8、RCTRootView当做UIView就可以运行
NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios"];
    
    RCTRootView *rootView =
    [[RCTRootView alloc] initWithBundleURL: jsCodeLocation
                                moduleName: @"RNHighScores"
                         initialProperties:
     @{
       @"scores" : @[
               @{
                   @"name" : @"Alex",
                   @"value": @"42"
                   },
               @{
                   @"name" : @"Joel",
                   @"value": @"10"
                   }
               ]
       }
                             launchOptions: nil];
2018-05-31 22:12:29 qq_35394891 阅读数 103
  • 卷积神经网络:网络架构

    1.熟悉Flink大数据生态圈以及未来发展趋势 2.快速上手开发Flink批处理程序和流处理程序 3.掌握了Flink核心知识与编程模型,深入理解Flink计算框架 4.掌握了Flink HA分布式集群安装部署

    164人学习 白勇
    免费试看

触发监听的页面

componentDidMount() {
    this.listener = DeviceEventEmitter.addListener('favoriteChanged_popular',this.FavoriteChanged());
    this.loadData();
}

备注:this.FavoriteChanged()是在接受到通知时触发的函数

           this.loadData()是重新刷新数据

发送通知的页面

DeviceEventEmitter.emit('favoriteChanged_popular');
备注:向监听名称为favoriteChanged_popular的页面发送通知,注意可以传参


2017-08-17 16:01:13 ZY_FlyWay 阅读数 1323
  • 卷积神经网络:网络架构

    1.熟悉Flink大数据生态圈以及未来发展趋势 2.快速上手开发Flink批处理程序和流处理程序 3.掌握了Flink核心知识与编程模型,深入理解Flink计算框架 4.掌握了Flink HA分布式集群安装部署

    164人学习 白勇
    免费试看

前言:

         在面向对象编程中,任何对象的存在都会存在生命周期。类似我们iOS 的View,就会有LoadView,ViewWillAppear,ViewDidLoad等等生命周期。RN也不例外,这篇主要学习RN的生命周期,在开发中如果掌握了并熟练的运用生命周期函数的话,往往开发能事半功倍。

    React Native生命周期简介





如图,可以把组件生命周期大致分为三个阶段:

  • 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,在这里完成了组件的加载和初始化;
  • 第二阶段:是组件在运行和交互阶段,如图中左下角虚线框,这个阶段组件可以处理用户交互,或者接收事件更新界面;
  • 第三阶段:是组件卸载消亡的阶段,如图中右下角的虚线框中,这里做一些组件的清理工作。

生命周期回调函数(ES5写法)

下面来详细介绍生命周期中的各回调函数,先说下和上图对应的ES5写法。

getDefaultProps

在组件创建之前,会先调用 getDefaultProps(),这是全局调用一次,严格地来说,这不是组件的生命周期的一部分。在组件被创建并加载候,首先调用 getInitialState(),来初始化组件的状态。

componentWillMount

然后,准备加载组件,会调用 componentWillMount(),其原型如下:

void componentWillMount()  

这个函数调用时机是在组件创建,并初始化了状态之后,在第一次绘制 render() 之前。可以在这里做一些业务初始化操作,也可以设置组件状态。这个函数在整个生命周期中只被调用一次。

componentDidMount

在组件第一次绘制之后,会调用 componentDidMount(),通知组件已经加载完成。函数原型如下:

void componentDidMount()  

这个函数调用的时候,其虚拟 DOM 已经构建完成,你可以在这个函数开始获取其中的元素或者子组件了。需要注意的是,RN 框架是先调用子组件的 componentDidMount(),然后调用父组件的函数。从这个函数开始,就可以和 JS 其他框架交互了,例如设置计时 setTimeout 或者 setInterval,或者发起网络请求。这个函数也是只被调用一次。这个函数之后,就进入了稳定运行状态,等待事件触发。

componentWillReceiveProps

如果组件收到新的属性(props),就会调用 componentWillReceiveProps(),其原型如下:

void componentWillReceiveProps(  
  object nextProps
)

输入参数 nextProps 是即将被设置的属性,旧的属性还是可以通过 this.props 来获取。在这个回调函数里面,你可以根据属性的变化,通过调用 this.setState() 来更新你的组件状态,这里调用更新状态是安全的,并不会触发额外的 render() 调用。如下:

componentWillReceiveProps: function(nextProps) {  
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}

shouldComponentUpdate

当组件接收到新的属性和状态改变的话,都会触发调用 shouldComponentUpdate(...),函数原型如下:

boolean shouldComponentUpdate(  
  object nextProps, object nextState
)

输入参数 nextProps 和上面的 componentWillReceiveProps 函数一样,nextState 表示组件即将更新的状态值。这个函数的返回值决定是否需要更新组件,如果 true 表示需要更新,继续走后面的更新流程。否者,则不更新,直接进入等待状态。

默认情况下,这个函数永远返回 true 用来保证数据变化的时候 UI 能够同步更新。在大型项目中,你可以自己重载这个函数,通过检查变化前后属性和状态,来决定 UI 是否需要更新,能有效提高应用性能。

componentWillUpdate

如果组件状态或者属性改变,并且上面的 shouldComponentUpdate(...) 返回为 true,就会开始准更新组件,并调用 componentWillUpdate(),其函数原型如下:

void componentWillUpdate(  
  object nextProps, object nextState
)

输入参数与 shouldComponentUpdate 一样,在这个回调中,可以做一些在更新界面之前要做的事情。需要特别注意的是,在这个函数里面,你就不能使用 this.setState 来修改状态。这个函数调用之后,就会把 nextProps 和 nextState 分别设置到 this.props和 this.state 中。紧接着这个函数,就会调用 render() 来更新界面了。

componentDidUpdate

调用了 render() 更新完成界面之后,会调用 componentDidUpdate() 来得到通知,其函数原型如下:

void componentDidUpdate(  
  object prevProps, object prevState
)

因为到这里已经完成了属性和状态的更新了,此函数的输入参数变成了 prevProps 和 prevState

componentWillUnmount

当组件要被从界面上移除的时候,就会调用 componentWillUnmount(),其函数原型如下:

void componentWillUnmount()  

在这个函数中,可以做一些组件相关的清理工作,例如取消计时器、网络请求等。


生命周期回调函数学习笔记小例(ES6)


学习就要与时俱进,试着接受和学习新东西,下面的例子都是用ES6写的。


1、设置默认属性


代码:

 class RNHybrid extends Component {
  
  render() {  
      return(  
        <View style={styles.container}> 
          <Text style={{padding:10, fontSize:42}}>
                {this.props.name}
          </Text>
        </View>  
      );  
   }
}


RNHybrid.defaultProps = {
  name: 'Mary',
};


效果:





ES5和ES6写法对比:

ES6

class Greeting extends React.Component {
  // ...
}

Greeting.defaultProps = {
  name: 'Mary'
};


ES5

var Greeting = createReactClass({
  getDefaultProps: function() {
    return {
      name: 'Mary'
    };
  },

  // ...

});


总结:
          props相当于iOS 里的属性,但是这个属性只是readonly。我们可以通过this.props来读取属性。


2、设置状态


   由图片我们知道,当我们修改状态的时候,会从新调用render函数重新渲染页面,所以一些和界面有关的动态变量需要设置成状态。

   如上一篇的例子,我在从新copy一遍:

看下效果:





代码:(生命周期现在还没有说我也是偏面的了解,以后会系统的学习,现在先不介绍)

[javascript] view plain copy
  1. constructor(props) {  
  2.         super(props);  
  3.         //设置当前状态是text  初始值为空  
  4.         this.state = {text: ''};  
  5.     }  
  6.   
  7.   render() {    
  8.       return(    
  9.         <View style={styles.container}>   
  10.           <TextInput style={styles.TextInputStyles}   
  11.               onChangeText={(Text)=>{  
  12.                 this.setState({text:Text});  
  13.               }}  
  14.           />   
  15.           <Text style={{padding:10, fontSize:42}}>  
  16.                 {this.state.text}  
  17.           </Text>  
  18.         </View>    
  19.       );    
  20.    }  

ES5和ES6写法对比:

ES6 

class myClass extends React.Component {
  constructor(props) {
    super(props);    this.state = {text:''};
  }
  // ...
}


ES5

var myClass = createReactClass({
  getInitialState: function() {
    return {text: ''};
  },
  // ...
});


ES5和ES6还有一个不同的地方,如果调用事件函数需要bind绑定

例如:

class RNHybrid extends Component {
  

  constructor(props) {
        super(props);
        this.state = {age:this.props.age};
    }

 handleClick() {
    alert(this.state.age);
  }

  render() {  
      return(  
        <View style={styles.container}> 
          <Text style={{padding:10, fontSize:42}} onPress={this.handleClick}>
                {this.props.name}
          </Text>
        </View>  
      );  
   }
}

这样写你点击的时候将会报错:



你需要将函数绑定:

1.可以在构造函数里绑定

 constructor(props) {
        super(props);
        this.state = {age:this.props.age};
        this.handleClick = this.handleClick.bind(this);
    }

2.还可以在调用的时候绑定

 <Text style={{padding:10, fontSize:42}} onPress={this.handleClick.bind(this)}>
                {this.props.name}
 </Text>


3、其他生命周期函数验证


代码:

import React, { Component } from 'react';
import {
   AppRegistry,
  StyleSheet,
  View,
  Text,
  TextInput,
} from 'react-native';

var  nowTime = new Date();
var  showText;

class RNHybrid extends Component {
  
  constructor(props) {  
        super(props);  
        console.log('state:'+nowTime);
        showText = 'state:'+nowTime+'\r\r';   
        //设置当前状态是text  初始值为空  
        this.state = {text: ''};  
  }


  componentWillMount(){
    console.log('componentWillMount:'+nowTime);
    showText = showText+'componentWillMount:'+nowTime+'\r\r';   
  } 

  componentDidMount(){
    console.log('componentDidMount:'+nowTime);
    showText = showText+'componentDidMount:'+nowTime+'\r\r';   
    alert(showText);
  } 

  shouldComponentUpdate(){
    console.log('shouldComponentUpdate:'+nowTime);
    showText = showText+'shouldComponentUpdate:'+nowTime+'\r\r';   
    return true;
  } 
   
  componentWillUpdate(){
    console.log('componentWillUpdate:'+nowTime);
    showText = showText+'componentWillUpdate:'+nowTime+'\r\r';       
  } 

  componentDidUpdate(){
    console.log('componentDidUpdate:'+nowTime);
    showText = showText+'componentDidUpdate:'+nowTime+'\r\r';       
  } 

  componentWillUnmount(){
    console.log('componentWillUnmount:'+nowTime);
    showText = showText+'componentWillUnmount:'+nowTime+'\r\r';       
  }

  render() {    
      return(    
        <View style={styles.container}>   
          <TextInput style={styles.TextInputStyles}   
              onChangeText={(Text)=>{  
                this.setState({text:Text});  
              }}  
          />   
          <Text style={{marginTop:10,padding:10, fontSize:15,borderColor:'gray',borderWidth:1}}>  
                {showText}  
          </Text>  
        </View>    
      );    
   }  
}

RNHybrid.defaultProps = {
  name: 'Mary',
  age:'18',
};


const styles = StyleSheet.create({
   container:{
   		marginTop:100,
   		flexDirection:'row',
      flexWrap:'wrap',
      justifyContent:'space-around',
   },
   TextInputStyles:{
      width:200,
      height:60,
      borderWidth:2,
      borderColor:'red',
   },
});

AppRegistry.registerComponent('RNHybrid', () => RNHybrid);


效果:




分析:

    当加载时候,按照 构造函数-> componentWillMount -> render->componentDidMount 这个顺序来的。
     细心的人可能会发现,界面上并没有显示componentDidMount,是因为执行了这个函数并没有重新render。
    当你输入的时候改变state就按照图上左下角部分进行。重新render的时候,就会看到componentDidMount出现。

    验证图上的分析是合理的,我们也放心了。

2018-09-14 21:43:40 chensenp 阅读数 2387
  • 卷积神经网络:网络架构

    1.熟悉Flink大数据生态圈以及未来发展趋势 2.快速上手开发Flink批处理程序和流处理程序 3.掌握了Flink核心知识与编程模型,深入理解Flink计算框架 4.掌握了Flink HA分布式集群安装部署

    164人学习 白勇
    免费试看

React Native升级0.57.4版本教程,及解决0.57.4版本和Xcode10报错问题

基于 Git 的自动合并更新

react-native-git-upgrade提供了豪华的一条龙自动合并更新流程

1. 安装 Git

你需要安装 Git,但这并不要求你自己使用 Git 去管理项目,只是我们的更新过程会使用到 Git 罢了。你可以在这里下载安装 Git,注意要把 Git 的路径添加到PATH变量中。

2. 安装react-native-git-upgrade工具模块

react-native-git-upgrade工具模块提供了命令行命令,因而需要全局安装(-g):

$ npm install -g react-native-git-upgrade

3. 运行更新命令

$ react-native-git-upgrade
# 这样会直接把react native升级到最新版本

# 或者是:

$ react-native-git-upgrade X.Y.Z
# 这样把react native升级到指定的X.Y.Z版本

升级过程会如丝般顺滑。当然在少数情况下,取决于具体的版本和你修改的程度,Git 的合并算法也可能遭遇失败产生一些冲突,需要你人工介入。

4. 解决冲突

文件中的冲突会以分隔线隔开,并清楚的标记出处,例如下面这样:

13B07F951A680F5B00A75B9A /* Release */ = {
  isa = XCBuildConfiguration;
  buildSettings = {
    ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
<<<<<<< ours
    CODE_SIGN_IDENTITY = "iPhone Developer";
    FRAMEWORK_SEARCH_PATHS = (
      "$(inherited)",
      "$(PROJECT_DIR)/HockeySDK.embeddedframework",
      "$(PROJECT_DIR)/HockeySDK-iOS/HockeySDK.embeddedframework",
    );
=======
    CURRENT_PROJECT_VERSION = 1;
>>>>>>> theirs
    HEADER_SEARCH_PATHS = (
      "$(inherited)",
      /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
      "$(SRCROOT)/../node_modules/react-native/React/**",
      "$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**",
    );

上面代码中的"ours"表示你自己的代码,而"theirs"表示 React Native 的官方代码。然后你可以根据实际情况判断,选择某一方晋级,另一方出局。

以下是我托管在Github上的代码, 这些是升级变更文件,升级后需要逐个检查,有冲突的按照以上方法解决

附:解决升级到Xcode10,react native项目运行报错问题

更多详情:https://reactnative.cn/docs/upgrading/

这是我的项目,如果对你有帮助,欢迎star:https://github.com/SemperChen/NovelAPP

演示视频:https://www.bilibili.com/video/av28309525/

截图