RN学习文档

一、React Native配置环境

  1. React Native中文网: http://reactnative.cn/docs/0.41/getting-started.html
  2. React Native环境配置(简书):http://www.jianshu.com/p/ab07248f6741

二、引入第三方库 / 组件

第三方库引入

npm install name(三方库名) --save 安装的同时,将信息写入package.json中

组件引入(自定义组件)

import TextInputView from '../../components/EF_TextInputView'

三、setState渲染问题

每次调用this.setState,都会自动调用render函数,重新渲染一下界面。
(Tip:ListView如果使用这种方法,必须更改一下数据源,但不建议多次使用这种方式渲染界面,可以使用Mbox,学习网址:http://v.youku.com/v_show/id_XMjQ4NTA4OTUwOA==.html?spm=a2hzp.8253869.0.0&from=y1.7-2)

    constructor(props) {
        super(props);
        this.state = {
            isLoading: true, // 下拉刷新数据标记
        };
    }
    _this.setState({
          isLoading: false,
   })

四、页面传值问题

1.直接传值

例如下侧代码中的 albumId= {this.props.albumId},=前面表示参数名,后面表示要传的数据。

<AlertCell
     modalVisible={this.state.modalVisible}
     navigator={this.props.navigator}
     coverType= {this.props.coverType}
     headerPhoto= {this.props.headerPhoto}
     albumId= {this.props.albumId}
     photosArr={photosArr}
     dataArr={dataArr}
     albumTitle={this.props.title1}
     albumDesc={this.props.albumDesc}
     {...this.props}
           onClose={() => {
                this.setState({modalVisible: false})
}}/>
2.跳转页面传值

使用Navigator进行页面跳转,进行传值时,

Navigator的使用

    /*
     * 设置Navigator转场方式
     * */
    configureScene = (route, routeStack) => {
        if (route.type == 'bottom') {
            return Navigator.SceneConfigs.FloatFromBottom; // 底部弹出
        } else if (route.type == 'fade') {
            return Navigator.SceneConfigs.FadeAndroid; // 淡入淡出
        }
        return Navigator.SceneConfigs.PushFromRight; // 右侧弹出
    };

    /*
     * 传值
     * */
    renderScene = (route, navigator) => {
        return <route.component navigator={navigator}  {...route.passProps} />;//传值(使用时参数名passProps要与这里统一)
    };

    render() {
        return (
            <View style={{flex: 1}}>
                <Navigator
                    style={{flex: 1}}
                    initialRoute={{component: Main}}//初始界面
                    configureScene={this.configureScene}
                    renderScene={this.renderScene}/>
                {/*加载全局的顶部提示框组件*/}
                <TopAlertBox />
            </View>
        )
    }

传值

   var navigator = this.props.navigator;
   navigator.push({
        title: '',
        component: CreateAlbumView,
        passProps: {
             title1: '新建相册',
             navigator: navigator,
             data: this.data,
        },
        type: 'bottom'
    })
3.反向传值

界面一:

   var navigator = this.props.navigator;
   navigator.push({
        title: '新建相册',
        component: CreateAlbumView,
        passProps: {
             title1: '',
             navigator: navigator,
             // 反向传值
             getAlbum: function(albumData) {
                 albumArr.push(albumData);
                 _this.setState({
                       dataSource: ds.cloneWithRows(albumArr),
                 })
             }
        },
        type: 'bottom'
    })

界面二:

    _this.props.getAlbum(albumData);
         if (_this.props.navigator) {
               _this.props.navigator.pop();
   }
4.通知传值

引入RCTDeviceEventEmitter

import RCTDeviceEventEmitter from 'RCTDeviceEventEmitter'

设置监听

    componentDidMount() {
        let me = this;
        // 删除相册
        this.delete_listener = RCTDeviceEventEmitter.addListener('删除相册',         function(albumId) {
            for (let i = 0; i < albumArr.length; i++) {
                if (albumArr[i].id === albumId) {
                    albumArr.splice(i, 1);
                }
            }
            me.setState({
                dataSource: ds.cloneWithRows(albumArr),
            })
        });
        // 编辑相册
        this.edit_listener = RCTDeviceEventEmitter.addListener('编辑相册', function(albumId, params) {
            for (let i = 0; i < albumArr.length; i++) {
                if (albumArr[i].id === albumId) {
                    albumArr[i].albumTitle = params.albumtitle;
                    albumArr[i].coverType = 1;
                    albumArr[i].albumCover = params.albumcover;
                }
            }
            me.setState({
                dataSource: ds.cloneWithRows(albumArr),
            })
        });
    }
    componentWillUnmount() {
        this.delete_listener.remove();
        this.edit_listener.remove();
    }

发通知

 RCTDeviceEventEmitter.emit('编辑相册', _this.state.albumId, params);

五、封装数据请求

     /*
     *  post请求发送说说
     *  params:参数
     *  callback:回调函数
     * */
    static postShortposts(params, callback) {
        url = API + 'shortposts/';
        let paramsStr = '';

        console.log('参数:' + JSON.stringify(params));
        if (params) {
            let paramsArray = [];
            //拼接参数
            Object.keys(params).forEach(key => paramsArray.push(key + '=' + params[key]))
            paramsStr += paramsArray.join('&');
        }

        console.log('url:  ' + url);
        console.log('body:  ' + paramsStr);
        //fetch请求
        fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: paramsStr,
        })
            .then((response) => response.json())
            .then((responseJSON) => {
                callback(responseJSON)
            }).done();
    }

六、flex布局

对于学习过CSS的人,直接按照以前的方式理解就行
http://reactnative.cn/docs/0.41/layout-with-flexbox.html#content

七、this指向问题

this在RN中就是指这个类本身,但是经常会报一些错误:not an object(this.)或者not a funcation等,这类问题一般有两种解决办法

1.在render中里面调用方法的时候,使用this.方法名.bind(this),重新绑定一下this

2.在方法里面, let _this = this,使用_this来调用本身类

八、性能优化问题

1、声明方法函数时,要尽量使用 方法名= ()=> {},这样会减少方法引用的次数。然后在调用的时候,直接使用this.方法名即可。

2、只有 shouldComponentUpdate 返回true的时候才会更新页面。。比较this.props的isClicked属性(属性看自己情况而定)与newProps的isClicked属性是否相同。

shouldComponentUpdate(newProps, newState){
        if(swllowArrayCompare(this.props.isClicked, newProps.isClicked)){
                renturn  true;
        }
        return false;
   }

3、使用属性的时候,如果不需要重新渲染的属性,直接在state外面声明即可,调用的时候 this.属性名,这样就不会调用render函数了,不会重新渲染界面。

4、在render中使用const {属性}= this.prps,直接使用属性名就可以调用。这样可以不用再state里面使用了,减少了渲染的次数。

5、推迟render的过程,在数据请求完之后,使用InteractionManager.runAfterInteractions( ()=> {this.setStates({})})

6、使用mbox,只改变需要改变的,不重新全部渲染。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 自己最近的项目是基于react的,于是读了一遍react的文档,做了一些记录(除了REFERENCE部分还没开始读...
    潘逸飞阅读 3,304评论 1 10
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,040评论 0 29
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,195评论 2 21
  • 有什么东西,在心里,应时常记起,却没记起。在活着,跳动着,却会偶尔失去记忆。 还以为,已经忘记,其实发现,它在那里...
    天然爱苏三阅读 191评论 0 2