react-native第一天笔记

写rn之前有必须了解哈生命周期;
https://blog.csdn.net/u012583459/article/details/52999564;这个兄弟写的很透彻,很好

http://bbs.reactnative.cn/topic/15/react-react-native-%E7%9A%84es5-es6%E5%86%99%E6%B3%95%E5%AF%B9%E7%85%A7%E8%A1%A8/13 // es5和es6写法的一些对比;

props是在父组件中进行设置,只要设置完成那么该在组件的声明周期中就定死了,不会发生改变;
所以针对数据变化修改的情况,我们需要使用state属性。

1.App.js 是一个项目的入口的文件;

import React, { Component } from 'react';
import Login from './src/pages/Main'
/**
 * 入口文件
 */
export default class App extends Component {
    render() {
        return (
           <Login/>
        );
    }
}

2.index.js 注册全局变量 比如说storage;navigation;
3.获取当前设备的宽度,便于百分比布局;
const SCREEN_WIDTH = Dimensions.get('window').width;
4.安卓返回键(返回到桌面,而不是直接退出程序)

import  {NativeModules} from 'react-native'  // 将原生模块引入进来
let  NativeCommonTools = NativeModules.CommonTools;   //  类
   goBack(){
        // 监听安卓返回事件 点了返回直接关闭app
        BackHandler.addEventListener('hardwareBackPress', () => {
             if(this.refs['tabBottom'].refs['statistics'].refs['orderTemplateItems'].state._isShow)                                                                                                                                                                { 
                    this.refs['tabBottom'].refs['statistics'].refs['orderTemplateItems'].dismiss();
            }else{
                NativeCommonTools.onBackPressed();          // 调用原生方法 返回到桌面 但是不退出程序       
}

           } );
       }

5.在组件销毁之后,android返回键的监听事件也销毁了
componentWillUnmount() {
if (Platform.OS === 'android') {
BackHandler.removeEventListener('hardwareBackPress',()=>{});
}
}

6.记录一般app的首页,会有几个常用应用,然后跳转到其他页面,去设置你自己喜欢的应用;
在rn,我之前一直是把=》 还是困恼了好久好久了 这种方法之前没有用过 没有这样的意识

   { imgUrl: require('./../../images/application/gonghaikeh.png'), text: '最爱vue', add: '',navigation:'SeasClient' },

imgurl 直接storage,四张图片弄成一个数组里面;一起保存,但是在其他页面的get的时候,imgurl直接就是38,39之类的数字,后来问网友,说的是保存的是项目的相对位置,但是get的时候是手机的目录,所以就会出现各种乱七八糟的图片,大小不一;
解决方法:在第二个页面,还是这样的操作,只是增加一个navigation这样的一个字段;
然后在首页:

//  初始化icon
 async initIcon(){
        let customize= await get('customize');   // 这是保存的数组
        if(customize != null){
            var icons = [];
            for (var item of customize) {      
                for (var icon of this.state.icons){   //  这是初始化的icon数据
                    if(icon.navigation == item.navigation){     // 两者进行相比较;导航字段相同的话
                        icons.push(
                            {
                                text: item.text,  
                                navigation: icon.navigation,
                                imgUrl: icon.path      // 就把初始化的icon的path 赋值给icons
                            }
                        )
                        break;
                    }
                }
            }
            this.setState({acceptPassedValue : icons});

        }
        // 初始化icon
        else if (customize == null){    // 用户第一次登陆进来  还没有storage,就初始化数据
            await set("customize", this.state.acceptPassedValue);
        }
    }

通俗一点的例子:你去见一个网友,然后你们之前没有见过,你们就是熟悉的陌生人,但是有了第三者—–(老王); 他认识你的网友,好,你们这样之间就有了桥梁(navigation);这样就好说话了,不会是见光死的那种了!

7.小提示

<TouchableHighlight     disabled={this.state.disabled}>   要想该组件不能点,只需要设置disabled={true}

 commonlyUsed.splice(index, 1);  // 删除当前的索引值  js这个方法没咋用到  在app的自我设置喜欢的常用的软件  要用到

8.在与后台交换时候,我们厂(装逼)都是给后台穿的是json对象,很少会传数组;

import { aa }  from './../../'
  this.state = {
            query : {           // 查询字段
                pageNum : 1,    // 当前页数
                pageSize : 1,   // 最大页数
            },
    }
     async componentWillMount(){               //  不需要打转转  就不用写在Didmount里面了
        let remind = await   aa(this.state.query);  //  直接就传对象,放回的data直接赋值给remind
        if(remind.result == -1){
            return;                              //  
        }
        this.setState({
            remind : remind.data.rows.length == 0 ? null : remind.data.rows[0],
        })
    }

9.一个标配的react-native的页面;

import React, { Component } from 'react';
import { View, Text, Image, StyleSheet, Dimensions, TouchableHighlight } from 'react-native'
const SCREEN_WIDTH = Dimensions.get('window').width;   //  这些就是你要引入的组件,还有接口名 

/**
 * 消息
 */
export default class News extends Component {
    constructor(props) {
        super(props)            //  在构造函数里面写函数,现在就只有在清除缓存的时候  才遇到过,其他都没有
        this.state = {          //  初始化状态 
            query : {
                pageNum : 1,    // 当前页数
                pageSize : 1,   // 最大页数
            },   
        }
    }
    async componentWillMount(){             //  组件初始化完成,可以写接口,准备渲染数据
    }
    render() {                    //   这里面写需要循环的数据  也可以console你获取的数据,这里就是render之后的,组件加载(操作dom了);
       let items = [];
        this.state.invoice.map((el, index) => {
            items.push(
                <View style={styles.expressItem} key={index}>
                    <View style={styles.expressRightFirst}>
                        <View style={styles.process}>
                            <Text style={{ color: '#888', fontSize: 15 }}>{el.ctime}</Text>
                            <Text style={{ color: '#464646', fontSize: 15 }}>{el.content}</Text>
                        </View>
                    </View>
                    <View style={styles.expressLeft}></View>
                </View>
            );
        });
        return (
            <View style={styles.container}>
                  {items}
            </View>
        );
    }
      edit() {    // render之外就写各种函数
      }
     componentWillUnmount() {                     //  组件销毁时候,把android的返回键的监听事件去除了
        if (Platform.OS === 'android') {
            BackHandler.removeEventListener('hardwareBackPress', () => { });
        }
    }
}

// 写css
const styles = StyleSheet.create({
    container:{
        flex: 1,
        backgroundColor:'#FAFAFA',
    },

});
{ this.state.announce == null ? '暂无信息' : this.state.announce.sourceContent }

明天接着更

猜你喜欢

转载自blog.csdn.net/szw_18583757301/article/details/80835023