从年中到如今也用ReactNative上线了一个电商项目了,再实战过程当中也经历了不少坑,所以记录下来,但愿帮助到更多的人。前两个是刚接触React时接触到的,但因为转到负责ReactNative的项目,所以后面记录的都是在ReactNative实战中遇到的问题。react
报错ERROR in ./entry.js Module build failed: SyntaxError: /Users/yixin/Desktop/react/entry.js: Unexpected token (2:8)
android
说是 "<" 这个符号有问题,缘由是babel6分离为多个包,而且默认不支持react和es2015。
所以除了npm install babel-loader --save-dev
之外还须要npm install babel-preset-es2015 babel-preset-react --save-dev
。
而后在loaders中添加:webpack
var babelPresets = {presets: ['react', 'es2015']}; loaders: [ { test: /\.js|jsx$/, loaders: ['babel', 'babel-loader?'+JSON.stringify(babelPresets)] } ]
则能够正常运行。ios
找不到dom节点: Uncaught Invariant Violation: _registerComponent(...): Target container is not a DOM element.
缘由是js在头部引入,因为src是同步下载,而后当即执行,而此时你的渲染树还未构建完毕,所以找不到dom节点。解决方法是在页面底部进行调用。es6
我是按照以前买的用JavaScript开发移动应用的例子来编写的,而后报了这个错。个人头部声明是这样的web
var React = require('react-native'); var { Text, View } = React;
通过查询后是因为'React'和'Component'从'react native'分离到了'react'模块。因此这里咱们只引入'react native'的模块是不够的,改为这样:express
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from 'react-native';
成功运行。另外推荐RN的ES5和ES6的语法对照表,做为初学者仍是颇有必要了解的
React/React Native 的ES5 ES6写法对照表npm
后面还会持续更新。。。react-native
问题以下:api
* What went wrong: A problem occurred configuring project ':app'. > Could not resolve all dependencies for configuration ':app:_debugCompile'. > Could not find com.android.support:support-v4:23.2.1. Searched in the following locations: file:/Users/yixin/.m2/repository/com/android/support/support-v4/23.2.1/support-v4-23.2.1.pom file:/Users/yixin/.m2/repository/com/android/support/support-v4/23.2.1/support-v4-23.2.1.jar
须要在sdk管理器中安装 Android Support Repository模块
问题以下:
* What went wrong: Execution failed for task ':app:installDebug'. > com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: device '76UBBKT22AZQ' not found
须要更改android的build.gradle,将第8行gradle的版本号更改成1.2.3classpath 'com.android.tools.build:gradle:1.2.3'
就能够正常运行了。
解决办法:在sdkTools安装Intel x86 Emulator Accelerator(HAXM installer)的状况下,
访问sdk目录下的extra->intel->Hardware_Accelerated_Execution_Manager下执行intelHAXM.dmg,重启android studio能够正常运行模拟器
缘由:在ES5语法下,React Native 组件的状态变量是在 getInitialState函数中初始化的
let MyComponent = React.createClass({ getInitialState: function() { return { scrollTop: new Animated.Value(0), }; }, });
而在ES6语法下,React Native 团队修改了状态变量的初始化方式,取消了单独的 getInitialState 函数,将初始化放在构造函数中,并提供 this.state实例变量用来存储状态变量。
解决办法:
class MyComponent extends React.Component { constructor(props) { super(props); this.state = { scrollTop: new Animated.Value(0), }; } }
当Text组件的fontSize等于height的时候,因为安卓和ios在Text组件中上方都自动留白,这时候会发现底部已经超出了组建范围而被遮挡。若是想设置Text垂直居中的效果建议能够用View作嵌套再经过flex布局来作到垂直居中
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, Image } from 'react-native'; var aImage = require('./tab.png'); class reactNative06 extends Component { render() { return ( <View style={styles.container}> <View style={{borderWidth:1,}}> <Text style={styles.welcome}> Ajfg你好 </Text> </View> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome:{ width:200, fontSize:50, borderWidth:1, textAlign:'center' } }); AppRegistry.registerComponent('reactNative06', () => reactNative06);
borderWidth属性在Android的Text组件上失效,解决办法也如上段代码同样使用View嵌套而后在View组建上添加borderWidth属性
TextInput组件经过multiline={true}设置为多行后,在iphone手机上TextInput组件的onSubmitEditing事件永远不会被处罚,它的回调函数也不会被执行,而安卓上正常。当TextInput失去焦点的时候建议选择onEndEditing
回调函数而不是onBlur
。
先说下TextInput在android和ios两个平台的区别。
只指定fontSize不指定height:
在iOS平台上,没有指定样式中的height键值的TextInput组件不会显示。在android平台上则为正常
height等于fontSize:
android平台上字体的上方有部分会被遮挡,在iOS平台上底部会稍微有点被遮挡,这时候能够设置paddingTop:0,paddingBottom:0
来解决。
height大于fontSize,有时候也会有遮挡,解决办法如上
reactnative新签名的apk在手机上安装不了(是由于以前调试的应用没删干净)
解决办法:adb uninstall "com.pepperrn"
手动经过包名来清理app。
而后再安装就正常了
问题描述:ReactNaitve调试模式下运行正常,打包release版本时没将静态资源文件打包进去,致使本地图片加载不出来
解决办法:能够将android目录删除掉而后运行react-native android
,从新构建安卓目录,再打包恢复正常。