待解决的问题
为什么class xxx {
getProfile = () => {
} 这么写是什么语法?以及https://www.jianshu.com/p/dae84967ba92,为什么
数组的reduce方法
为什么这个函数叫做 Reducer 呢?因为它可以作为数组的reduce
方法的参数。请看下面的例子,一系列 Action 对象按照顺序作为一个数组。 不懂?
rn里app.js “export default App” 在哪里被import调用?
“每个组件中要用到 store,按之前的方法需要单独引入Stroe.js”,但是讲道理不会import一次执行一次createStore吗?
export default appState / export const appState异同点
LoginScene里this.setState({ errMsgVisible: true }) 跳转页面的瞬间state全部变回初始值,然后又变回现有值,bug待解决
LoginScene.tsx里,propsl里自带navigation,对于navigation的interface定义要手动?
页面跳转但是数据没跟上时会出现渲染瞬间的白屏,怎么解决?
bug:无限滚动加载一次就卡顿
detail回到list,going/like数据不同步
涉及的知识点
无限滚动列表的实现:
比较了RN的FlatList和三方的RecyclerListView (https://www.tuicool.com/articles/6NnEjyA),
选择先熟悉官方亲儿子,况且三方可能有坑和隐藏bug。
onEndReachedThreshold传入的是个页面百分比
引入redux & redux saga
文件命名:
组件大写,工具类大写,其他驼峰
import { call, put, takeEvery } from 'redux-saga/effects' //一定要/effects,否则找不到
Store/State/Action
修改Store的唯一办法 - Store dispatch 一个 action
store.dispatch({
type: 'ADD_TODO',
payload: 'Learn Redux'
});
Store收到一个Action后,通过Reducer来生成自己新的State。
Reducer接收两个参数:原State和此Action
Reducer 函数里面不能改变 State,必须返回一个全新的对象
------------------------------------------------
如何在组件里使用store?
1、父组件传入
2、自己引入store
3、更优雅可以使用react-redux (顶层引入<Provider>)
(https://juejin.im/post/5b755537e51d45661d27cdc3)
无限滚动
bug:listScene点击放大镜不能打开左侧边栏
debug:因为调用组件属性isOpen={}写成了自己的searchOpen={}
------------------------------------------------
引入ts
=》install 相关包,并生成tsconfg.json
=>文件tsx后缀和ts后缀改写,内容加上interface改写
=>改写tsconfig.json 的 lib 解决ts编译成js报错"lib":
["dom","es2016", "es2017"],去掉dom的lib
=>跑tsc,明明删掉了其他文件只剩login测试页面,但是其他页面的js+js.map也在lib里
=》删掉lib,重启,并尝试直接expo start,居然直接能跑
(原因https://docs.expo.io/versions/latest/guides/typescript/,expo可以直接编译ts)
=>因此,expo工具下不需要先编译后打包。一些传统项目需要js的可以先用tsc命令编译出js。
=>即使有ts红线,也可以跑,就像Word文档有红线不影响编辑
多语言问题:
使用三方package ‘react-native-i18n’,
即时改变语言不是直接 i18n.locale = ‘en'就可以的,因为没有监听的逻辑,需要setState触发render方法。
TouchableWithoutFeedback的坑:
svg可以撑起view的宽高,不能撑起TouchableWithoutFeedback的宽高
view可以撑起TouchableWithoutFeedback的宽高,svg不行
rn布局记录:
利用flex:n 可以做元素在主轴上的空间分配。
position:absolute 和pc端一样脱离文档流,放在dom流前面会因为脱离文档流而在z-index层级上被后面的元素覆盖
顶部和底部固定:
<Parent> flex:1
<top1> height:100
(<top2> height:80)
<middle> flex:1, scrollView组件不需要
<foot1> height:80
(<foot2> height:100)
</Parent>
在该项目后台中,delete和post请求一样,需要带body,即使为空(JSON.stringify({})),get带body则报错
this.setState({activeTypeInd:typeInd});
setTimeout(()=>{
this.getEvents();
},0)
this.setState({activeTypeInd:typeInd});
console.log() //老值
setTimeout(()=>{
console.log() //新值
},0)
子元素在副轴上默认扩展适应,
但是如果手动设置width/height:100%的话,在父元素没有指定宽度/高度的情况下反而为0
Text的borderRadius无法框住background会漏出。View就和pc端一样可以。
Date().getMonth(), 从0开始
同理,new Date(yyyy, mm, dd),其中mm传12是次年一月,传13是次年二月,以此类推
today = new Date();
now = this.today.getTime();
todayEnd = new Date(new Date(this.today.toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1).getTime();
tomorrowStart = this.todayEnd + 1;
tomorrowEnd = this.tomorrowStart + 24 * 60 * 60 * 1000 - 1;
weekEnd = this.todayEnd + (7 - (this.today.getDay())) * 24 * 60 * 60 * 1000;
monthEnd = new Date(this.today.getFullYear(), this.today.getMonth(), 1).getTime() - 1;
//总结:记住用法:toLocaleDateString()/getDay()/new Date()
计算屏幕宽高
const { width, height } = Dimensions.get('window');
多级子元素之间,层层emit后又下发的话考虑用redux抽出状态来达到目的。
评论栏被输入键盘弹上去:
position:'absolute',
//评论栏wrap
<View style={this.state.keyboardShow ?
[styles.container, { position: 'absolute', bottom: this.state.keyboardHeight }] : styles.container}>
//评论栏
</View>
componentDidMount() {
this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', (e) => {
this.setState({
keyboardShow: true,
keyboardHeight: e.endCoordinates.height
})
});
this.keyboardWillHideListener = Keyboard.addListener('keyboardWillHide', (e) => {
this.setState({
keyboardShow: false,
keyboardHeight: 0
})
});
}
componentWillUnmount() {
this.keyboardDidShowListener.remove();
this.keyboardWillHideListener.remove();
}
ScrollView组件,不管横纵向,都不能在组件本身的style里出现justifyConent或alignItems,但是子元素无所谓。