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

发布了34 篇原创文章 · 获赞 1 · 访问量 7901

猜你喜欢

转载自blog.csdn.net/landiyaaa/article/details/90712811