作者: admin

  • react兼容ie8

    react可以作用在pc端开发

    react native可以用在移动端开发而且还是支持跨平台在ios和安卓下使用

    关于在react在pc端中兼容ie8的问题可以尝试引入一下js,记得顺序也不要弄错:

    <script type="text/javascript" src="build/es5-shim.min.js"></script>
    <script type="text/javascript" src="build/es5-sham.min.js"></script>
    <script type="text/javascript" src="build/react.js"></script>
    <script type="text/javascript" src="build/JSXTransformer.js"></script>
  • 为react native添加导航-react-native-vector-icons

    react native有自己提供的导航条,但是这里推荐使用react-native-vector-icons

     

    按照以下步骤进行:

    sudo npm i react-native-vector-icons@2.0.2 --save
    sudo npm i rnpm@1.9.0 -g
    下载好模块之后还不能直接使用,要执行一下步骤的其中之一
    sudo react-native link react-native-vector-icons //先尝试这条
    rnpm link react-native-vector-icons//上面不成功在尝试这样

     

    成功提示:

    rnpm-installinfoAndroid module react-native-vector-icons is already linked 

    rnpm-installinfoiOS module react-native-vector-icons is already linked 

    rnpm-installinfoLinking assets to ios project 

    rnpm-installinfoLinking assets to android project 

    rnpm-installinfoAssets have been successfully linked to your project 

     

    想要什么图标就自己去对应的找名称:

    http://fontawesome.io/icons/ 

     

    用法可以参考:

    https://github.com/oblador/react-native-vector-icons

     

    案例:

    var Icon=require('react-native-vector-icons/FontAwesome');
    
    var {
     AppRegistry,
     StyleSheet,
     TabBarIOS,
     Text,
     View
    } = react_native;
    
    _renderContent: function(color: string, pageText: string, num?: number) {
     return (
       <View style={[styles.container, {backgroundColor: color}]}>
        <Text style={styles.tabText}>{pageText}</Text>
        <Text style={styles.tabText}>{num} re-renders of the {pageText}</Text>
       </View>
     );
    }
    
    return (
     <TabBarIOS
       tintColor="white"
       barTintColor="darkslateblue">
         <Icon.TabBarItem
          title="搜索"
          iconName="search"
          selectedIconName="search"
          selected={this.state.selectedTab === 'blueTab'}
          onPress={() => {
            this.setState({
              selectedTab: 'blueTab',
            });
          }}>
          {this._renderContent('#fff', 'Blue Tab')}
         </Icon.TabBarItem>
    
        <Icon.TabBarItem
          title="搜索"
          iconName="search"
          selectedIconName="search"
          selected={this.state.selectedTab === 'redTab'}
          onPress={() => {
            this.setState({
              selectedTab: 'redTab',
              notifCount: this.state.notifCount + 1,
            });
          }}>
          {this._renderContent('#fff', 'Red Tab', this.state.notifCount)}
         </Icon.TabBarItem>
    
         <Icon.TabBarItem
           title="搜索"
           iconName="search"
           selectedIconName="search"
           selected={this.state.selectedTab === 'greenTab'}
           onPress={() => {
              this.setState({
                selectedTab: 'greenTab',
                presses: this.state.presses + 1
              });
           }}>
           {this._renderContent('#fff', 'Green Tab', this.state.presses)}
          </Icon.TabBarItem>
      </TabBarIOS>
    );

    注意:TabBarIOS是react native自带,记得要接口声明出来

    如果遇到模块下载了没有加载出来就参考:《解决:react native找不到加载模块

  • 解决:react native找不到加载模块

    在开发react native时候突然发现模块确实是下载好了,用正常的方法去加载就是死活都加载不到,这是后我们应该清除一下npm缓存,例如:

    watchman watch-del-all
    sudo npm cache clean 
    sudo npm install
  • react native生命周期

    nrzhouqi

    getDefaultProps() //获取初始的配置参数,一般配置参数都是预先设置好的(react native默认配置)

    例如,用户点击app第一次进入首页时发生了以下步骤
    getInitialState() //获取初始的状态值,会发生变化的数据放入里面 (设置默认初始值)
    componentWillMount() //在渲染显示视图之前要执行的函数方法,其实就是把之前设置的值获取到 (显示视图模式之前的回调)
    render() //经过了componentWillMount后就开始显示视图模型了 (显示视图)
    componentDidMount() //视图渲染完成后,要发生的回调 (显示视图后的回调)

    以上顺序就是当手机刷新第一次用户看到页面时,调用到的函数。
    页面不可能一点都不变化,例如点击分页,页面跳转总会发生变化,也就是状态会发生变化。例如,用户点击分页2时发生如下步骤

     

    页面发生改变时情况一:
    shouldComponentUpdate() //状态发生变化时,就触发此函数 (修改之前getInitialState里面的值)
    componentWillUpdate() //shouldComponentUpdate函数确定触发时,此函数才会触发,这里必须返回布尔值,否则会出错
    render() //显示视图 (页面发生更新)
    componentDidUpdate() //更新后的回调

     

    页面发生改变是情况二:(外部传入参数时)
    外部传入参数时,外部props改变
    componentWillReceiveProps() //外部的props改变时就触发此函数
    shouldComponentUpdate()
    componentWillUpdate()
    render()
    componentDidUpdate()

     

    ———————–父、子组件嵌套之间的关系——————————-

    当子模板嵌套在父模板时,查看个个周期都执行的先后顺序:

    初次加载页面时:

    rnzhou1

     

    界面改变时:

    rnzhou2

     

     

  • es6的export和import

    js 导入 导出 模块

    主要运用在commonjs标准封装成的模块使用

    export //对外提供接口

    基本写法:
    var firstName = ‘Michael’;
    var lastName = ‘Jackson’;
    var year = 1958;

    写法一:
    export {firstName, lastName, year}; //可以输出变量

    写法二:
    export var firstName = ‘Michael’;

    export function multiply(x, y) { //也可以输出class

    return x * y;
    };

    写法三:
    export { //利用as重新命名(感觉没必要)
    firstName as streamV1,
    lastName as streamV2,
    year as streamLatestVersion
    };

    1,记住要使用export输出变量或者函数时必须加上画括号{}
    2,export不能放在某个函数或者类中,它必须处在模块全局中
    -------------------------------------------

    import //加载/导入模块,并获取模块对外提供的变量或者函数,无论写在什么位置程序第一个先执行它

    import {firstName, lastName, year} from ‘./profile’;
    //加载profile模块,并且要与export对外提供的接口一一对应顺序一样,不能自定义名称,名称只能和export对外提供的接口名称一致

    import { lastName as surname } from ‘./profile’; //如果想改名称可以用as来改
    如果import和export同时存在一个模块中,先输入后输出也就是先执行import在执行export,例如:
    export { es6 as default } from ‘./someModule’;
    // 等同于
    import { es6 } from ‘./someModule’;
    export default es6;

    import加载模块获取接口时有一个弊端就是要预先知道对外提供接口的名称,还要一一对应写出来,这样就麻烦了万一一个接口有几十个接口呢
    这样时候我们可以利用*来代替,例如:
    import * as circle from ‘./circle’;
    运用时直接就circle.xx就可以调用到了,但预先还是要知道对外接口的名称
    使用了*本身就忽律了默认接口,但是又不可能一一把所有接口都列出来麻烦
    如果一个模块对外提供的接口有默认接口和一些取好了名字的接口,我们可以把默认接口独立出来,例如:
    import * as math from ‘circleplus’; //将其他固定名字的接口取出来统一放在math中
    import exp from ‘circleplus’; //在把默认接口独立取出来

     

    ---------------------------------------

    export default //默认接口,作用就是import时,不必预先知道输出的接口名称是什么,这是为了方便import获取对外接口

    export default要配合import才能讲解

    用法一:
    // export-default.js
    export default function () { //export default后面直接加匿名函数,如果是非匿名也可以但最后输出的还是匿名函数
    console.log(‘foo’);
    }

    调用:
    // import-default.js
    import customName from ‘./export-default’; //这里的customName是自定义的,不用去管export对外接口是什么名字了

     

    用法二:
    var a = 1;
    export default a; //直接加变量名
    注意export default var a = 1; 这样写是错误的

     

    用法三:
    // MyClass.js
    export default class { … } //也可以输出类
    // main.js
    import MyClass from ‘MyClass’;
    let o = new MyClass();

     

    一些转化关系,自己体会下吧

     // modules.js
    function add(x, y) {
     return x * y;
    }
     export {add as default};
     // 等同于
     // export default add;
    // app.js
     import { default as xxx } from 'modules';
     // 等同于
     // import xxx from 'modules';

     

    http://es6.ruanyifeng.com/#docs/module#import命令