entry task涉及知识点记录【2】

 

待解决的问题

 

为什么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,但是子元素无所谓。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章