/HelloWorldApp

关于React Native的使用

Primary LanguageJavaScript

以下实例和整理转自官方文档:http://reactnative.cn/docs/0.41/getting-started.html
在此致敬

栗子:
    export default class HelloWorldApp extends Component {
      render() {
        return (
          //JSX——是一种在JavaScript中嵌入XML结构的语法
          //<Text>组件,它专门用来显示文本
          <Text>Hello world~!</Text>
        );
      }
    }

    // 注意,这里用引号括起来的'HelloWorldApp'必须和你init创建的项目名一致
    AppRegistry.registerComponent('HelloWorldApp', () => HelloWorldApp);
=====================================================================================
JSX语法
    一种在JavaScript中嵌入XML结构的语法。
    很多传统的应用框架会设计自有的模板语法,让你在结构标记中嵌入代码。
    React反其道而行之,设计的JSX语法却是让你在代码中嵌入结构标记。初看起来,这种写法很像web上的HTML,
    这里我们使用的是React Native的组件。
    上面的示例代码中,使用的是内置的<Text>组件,它专门用来显示文本

=====================================================================================
组件
    定义了一个名为HelloWorldApp的新的组件(Component),
    并且使用了名为AppRegistry的内置模块进行了“注册”操作。
    你在编写React Native应用时,肯定会写出很多新的组件。
    而一个App的最终界面,其实也就是各式各样的组件的组合。
    组件本身结构可以非常简单——唯一必须的就是在render方法中返回一些用于渲染结构的JSX语句。

=====================================================================================
属性props和state
    props是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变。
    对于需要改变的数据,我们需要使用state
        一般来说在constructor中初始化state,然后在需要修改时调用setState方法

=====================================================================================
样式style(见greetStyles的使用)

    所有的核心组件都接受名为style的属性。
    这些样式名基本上是遵循了web上的CSS的命名,只是按照JS的语法要求使用了驼峰命名法,
    例如将background-color改为backgroundColor

    实际开发中组件的样式会越来越复杂,我们建议使用StyleSheet.create来集中定义组件的样式

=====================================================================================
1.宽和高 (见组件FixedDimensionsBasics)
    style={{width:50,height:50}} --固定宽高
    style={{flex:1}} --权重


2.位置和排列Flexbox
  (同CSS3 Flexbox)
    http://weibo.com/1712131295/CoRnElNkZ?ref=collection&type=repost#_loginLayer_1486368234186

    可以在不同屏幕尺寸上提供一致的布局结构
    一般来说,使用flexDirection、alignItems和 justifyContent三个样式属性

    React Native中的Flexbox的工作原理和web上的CSS基本一致,当然也存在少许差异。
    flexDirection的默认值是column而不是row,而flex也只能指定一个数字值


    一、flexDirection决定布局的排列方向
        子元素是应该沿着水平轴(row)方向排列,还是沿着竖直轴(column)方向排列
        默认值是竖直轴(column)方向

    二、justifyContent决定其子元素沿着水平方向的排列方式
    三、alignItems    决定其子元素沿着竖直方向的排列方式

=====================================================================================
TextInput(见组件PizzaTranslator)
    一个允许用户输入文本的基础组件
    属性onChangeText      --会在文本变化时被调用
    属性onSubmitEditing   --会在文本被提交后(用户按下软键盘上的提交键)调用

=====================================================================================
一、静态图片资源
    React Native提供了一个统一的方式来管理iOS和Android应用中的图片
    图片文件的查找会和JS模块的查找方式一样

    Packager就会去这个组件所在的文件夹下查找my-icon.png。
    并且my-icon.ios.png和my-icon.android.png,Packager会根据平台而选择不同的文件

    .
    ├── button.js
    └── img
        ├── check@2x.png
        └── check@3x.png

   button.js里有这样的代码--require中的图片名字必须是一个静态字符串不能使用引用
        <Image source={require('./img/check.png')} />

        // 错误
        var icon = this.props.active ? 'my-icon-active' : 'my-icon-inactive';
        <Image source={require('./' + icon + '.png')} />

        // 正确
        var icon = this.props.active ? require('./my-icon-active.png') : require('./my-icon-inactive.png');
        <Image source={icon} />

   一些好处:

       iOS和Android一致的文件系统。
       图片和JS代码处在相同的文件夹,这样组件就可以包含自己所用的图片而不用单独去设置。
       不需要全局命名。你不用再担心图片名字的冲突问题了。
       只有实际被用到(即被require)的图片才会被打包到你的app。
       现在在开发期间,增加和修改图片不需要重新编译了,只要和修改js代码一样刷新你的模拟器就可以了。
       与访问网络图片相比,Packager可以得知图片大小了,不需要在代码里再声明一遍尺寸。
       现在通过npm来分发组件或库可以包含图片了。


二、使用混合App的图片资源
   如果你在编写一个混合App(一部分UI使用React Native,而另一部分使用平台原生代码),也可以使用已经打包到App中的图片资源(通过Xcode的asset类目或者Android的drawable文件夹打包):

   <Image source={{uri: 'app_icon'}} style={{width: 40, height: 40}} />
   注意:这一做法并没有任何安全检查。你需要自己确保图片在应用中确实存在,而且还需要指定尺寸。

三、网络图片(需要手动指定图片的尺寸)
    // 正确
    <Image source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}}
           style={{width: 400, height: 400}} />

    // 错误
    <Image source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}} />

=====================================================================================
ScrollView(见IScrolledDownAndWhatHappenedNextShockedMe)
    一个通用的可滚动的容器,你可以在其中放入多个组件和视图

=====================================================================================
ListView(见ListViewBasics)
    dataSource是列表的数据源
    renderRow逐个解析数据源中的数据,然后返回一个设定好格式的组件来渲染

=====================================================================================
Fetch API
    /**网络请求*/
    1.fetch('https://mywebsite.com/mydata.json')

    2.fetch('https://mywebsite.com/endpoint/', {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        firstParam: 'yourValue',
        secondParam: 'yourOtherValue',
      })
    })

    3.fetch('https://mywebsite.com/endpoint/', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: 'key1=value1&key2=value2'
    })

    /**响应数据*/
    getMoviesFromApiAsync() {
       return fetch('http://facebook.github.io/react-native/movies.json')
           .then((response) => response.json())
           .then((responseJson) => {
               return responseJson.movies;
           })
           .catch((error) => {
               console.error(error);
           });
    }


XMLHttpRequest API(ajax)
    var request = new XMLHttpRequest();
    request.onreadystatechange = (e) => {
      if (request.readyState !== 4) {
        return;
      }

      if (request.status === 200) {
        console.log('success', request.responseText);
      } else {
        console.warn('error');
      }
    };

    request.open('GET', 'https://mywebsite.com/endpoint/');
    request.send();

=====================================================================================
Navigator(管理多个页面间的跳转)
    一、场景的概念--摆放在一个屏幕中的组件,就共同构成了一个"场景"