大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
这样就可以使用 cnpm 命令来安装模块了:
$ cnpm install [name]
1:Text超长显示'...'缩略号:
设置:numberOfLines={1} style={{width:20}},宽度自定义,超长便会显示缩略号,默认缩略号在右手边。如果需要改变缩略号的位置可以使用ellipsizeMode 属性
值有:‘head’ 头部 ‘middle’中间 ‘tail’右边
处理方法:打开文件:react-modules/react-native/local-cli/server/server.js
在 function server(argv: mixed, config: RNConfig, allArgs: Object) 函数中注销代码:
process.exit(11);即可
npm WARN tar zlib error: unexpected end of file
npm ERR! cb() never called!
npm ERR! This is an error with npm itself. Please report this error at:
解决方法
npm cache clean --force
npm install
Could not install the app on the device, read the error above for details.
Make sure you have an Android emulator running or a device connected and have
set up your Android development environment:
1:如果你的手机上已安装了该应用可以尝试卸载应用再次运行react-native run-android.有时候能够解决问题。
adb reverse tcp:8081 tcp:8081 #建立一个从设备向电脑转发的端口
由于Icon有不同的提供者例如(Entypo,EvilIcons、FontAwesome等等https://oblador.github.io/react-native-vector-icons/中查看)
默认情况下,会使用“Ionicons”提供的icon。那么,如果我想使用的icon不是”Ionicons“提供的可怎么办呢?
方法一:Map 循环
注意:map循环中必须传递key参数,否则出现警告:Warning: Each child in an array or iterator should have a unique "key" prop.
productListss(orderDetail){
return orderDetail['orderDetails'].map((item,index)=>{
return
})
}
方法二:for循环
productListss(orderDetail){
for(var index in orderDetail['orderDetails']){
return
}
}
一定要添加:keyExtractor={(item,index)=>index.toString()},否则会报黄屎一样的警告: VirtualizedList: missing keys for items, make sure to specify a key property on each item or provide a custom keyExtractor.
{ this.beginHeaderRefresh() }}
refreshing={this.state.isHeaderRefreshing}
onEndReached={() => { this.beginFooterRefresh() }}
onEndReachedThreshold={0.1} // 这里取值0.1,可以根据实际情况调整,取值尽量小
ListFooterComponent={this._renderFooter}
keyExtractor={(item, index) => index.toString()}
/>
方法:
1:通过命令打开菜单
adb shell input keyevent 82
let date=new Date("2019-04-24 12:12:12");
在调试模式下完全没有问题
但是在非调试模式下date=NaN
方法:
function parseDate(dateString){
let dateParam = dateString.split(/[\s-:]/);
dateParam[1] = (parseInt(dateParam[1], 10) - 1).toString()
return new Date(...dateParam)
};
调用方法 let date=parseDate(2019-04-24 12:12:12);
SyntaxError: Unexpected token in JSON at position 0
at JSON.parse ()
at FileStore.get(:****\node_modules\metro-cache\src\stores\FileStore.js:26:19)
在发布版本后进行调试提示异常,
方法:
npm start -- --reset-cache
清理缓存,然后再次react-native run-android
默认导航栏切换时,只会第一次切换会调用:componentDidMount,初始化函数,如果跳转到其它页面后返回时需要刷新页面怎么办?
方法:
componentDidMount() {
this._navListener = this.props.navigation.addListener('didFocus', () => {
this.refreshView();//刷新页面方法
});
}
componentWillUnmount() {
this._navListener.remove();
}
方法1:
可能是模拟器或者手机没有内存了,清空部分内存就可以了。(其它问题暂时没发现,但是应该没那么简单)
this.setState({cardNo_add:text})}
>
改为
value={`${this.state.cardNo_add}`} 注意" ` "这个符号不要搞错
this.setState({cardNo_add:text})}
>
Script 'F:\-----\node_modules\react-native\react.gradle' line: 95
* What went wrong:
A problem occurred configuring project ':app'.
> Could not get unknown property 'mergeResourcesProvider' for object of type com.android.build.gradle.internal.api.ApplicationVariantImpl.
方法:
distributionUrl
为distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
build.gradle
文件中将gradle类路径更改为:classpath 'com.android.tools.build:gradle:3.3.0'
style中添加:paddingVertical:0即可解决
方法:外层包裹ScrollView,并添加属性:keyboardShouldPersistTaps
'never' (默认值),点击 TextInput 以外的子组件会使当前的软键盘收起。此时子元素不会收到点击事件。
'always',键盘不会自动收起,ScrollView 也不会捕捉点击事件,但子组件可以捕获。
'handled',当点击事件被子组件捕获时,键盘不会自动收起。这样切换 TextInput 时键盘可以保持状态。多数带有TextInput 的情况下你应该选择此项。
false,已过时,请使用 'never'代替。
true,已过时,请使用 'always' 代替。
经测试,使用 always 或者 handled 均可解决发生的问题,由于我这里是 ScrollView 内部存在多个 TextInput,故选择 handled 值。
RNGestureHandlerEvent.java:20: 错误: 程序
包Pools不存在
new Pools.SynchronizedPool<>(TOUCH_EVENTS_POOL_SIZE);
....
解决方法:android/gradle.properties 中添加:android.useAndroidX=true android.enableJetifier=true
解决方法:
1:在gradle.properties加上
android.useDeprecatedNdk=true
2:build.gradle加上
android {
...
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi"
}
}
}
解决方法:关闭项目和AndroidStudio,并删除:.idea文件夹,重新打开项目,问题就解决了
在项目根目录下添加global.d.ts申明文件:
declare module '*.svg'
declare module '*.png'
declare module '*.jpg'
declare module '*.jpeg'
declare module '*.gif'
declare module '*.bmp'
declare module '*.tiff'
declare module '*.mp3'
25:Android中无法播放GIF动图
打开:android/app/build.gradle文件,在dependencies中添加第三方库:
implementation 'com.facebook.fresco:animated-gif:1.11.0'
dependencies {
implementation 'com.facebook.fresco:animated-gif:1.11.0'
}
在android下执行:gradlew clean,然后再执行:react-native run-android 即可
26:setState执行的关键步骤
1、React的更新策略已被启动时(事件触发时)
react响应事件处理=>启动更新策略事务(绑定了wrapper)=> 事务perform => setState =>获取内部实例 =>更新策略事务perform完毕 =>wrapper 处理组件状态的更新。
2、React的更新策略没有被启动时(异步触发时)
setState =>获取内部实例 => 存储新的状态 =>发现更新策略事务未启动 =>启动更新策略事务(绑定了wrapper)=> 事务perform => 将当前内部实例放入旧组件数组=>更新策略事务perform 完毕=> wrapper 处理状态的更新=>setState执行结束。