react-native

记一下从开始到第一个项目中的问题。

01.expected a component class gotobject

importMessageDetailViewContainerfrom'./Messagedetail/MessageDetailViewContainer';

if(key ==='messageDetail'){

return

}

组件首字母要大写

02.dependencies与devDependencies的区别

devDependencies下列出的模块,是我们开发时用的依赖项,像一些进行单元测试之类的包,比如grunt-contrib-uglify,我们用它混淆js文件,它们不会被部署到生产环境。dependencies下的模块,则是我们生产环境中需要的依赖,即正常运行该包时所需要的依赖项。

如果你将包下载下来在包的根目录里运行,执行如下命令,默认会安装两种依赖

npm install

如果你只是单纯的使用这个包而不需要进行一些改动测试之类的,只安装dependencies而不安装devDependencies。执行:

npm install--production

通过“npm install

packagename”进行安装,只会安装dependencies

npm installpackagename

如需安装devDependencies,执行:

npm installpackagename --dev

03.export default , export区别:import的时候export不带{} export要带{},export

default只能有一个

04.rest语法

functionanimals(...types){

console.log(types)

}

animals('cat','dog','fish')//["cat","dog","fish"]

而如果不用ES6的话,我们则得使用ES5的arguments。

05.()=>arrow function

不用指定this,当我们使用箭头函数时,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this。

06.继承

classAnimal{

constructor(){

    this.type ='animal'

}

says(say){

   console.log(this.type +' says '+ say)

}

}

letanimal =newAnimal()

animal.says('hello')//animal says hello

classCatextendsAnimal{

constructor(){

super()

 this.type ='cat'

}

}

let cat=newCat()

cat.says('hello')//cat says hello

constructor内定义的方法和属性是实例对象自己的,而constructor外定义的方法和属性则是所有实例对象可以共享的。

Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。上面定义了一个Cat类,该类通过extends关键字,继承了Animal类的所有属性和方法。

super关键字,它指代父类的实例(即父类的this对象)。子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

一个组件的组织结构

1classdefinition

    1.1constructor

        1.1.1event handlers

    1.2'component'lifecycle events

    1.3getters

    1.4render

2defaultProps

3proptypes

PropTypes和getDefaultProps()

1.一定要写PropTypes,切莫为了省事而不写

2.如果一个Props不是requied,一定在getDefaultProps中设置它

React.PropTypes主要用来验证组件接收到的props是否为正确的数据类型,如果不正确,console中就会出现对应的warning。出于性能方面的考虑,这个API只在开发环境下使用。

基本使用方法:

propTypes: {

myArray: React.PropTypes.array,

myBool: React.PropTypes.bool,

myFunc: React.PropTypes.func,

myNumber: React.PropTypes.number,

myString: React.PropTypes.string,

// You can chain any of the above with `isRequired` to make sure a warning

// is shown if the prop isn't provided.

requiredFunc: React.PropTypes.func.isRequired

}

假如我们props不是以上类型,而是拥有复杂结构的对象怎么办?比如下面这个:

{

text:'hello world',

numbers: [5,2,7,9],

}

当然,我们可以直接用React.PropTypes.object,但是对象内部的数据我们却无法验证。

propTypes:{

myObject:React.PropTypes.object,

}

进阶使用方法:shape()和arrayOf()

propTypes:{

myObject:React.PropTypes.shape({

text: React.PropTypes.string,

numbers: React.PropTypes.arrayOf(React.PropTypes.number),

})

}

下面是一个更复杂的Props:

[

{

name:'Zachary He',

age:13,

married:true,

},

{

name:'Alice Yo',

name:17,

},

{

name:'Jonyu Me',

age:20,

married:false,

}

]

综上,:

propTypes:{

myArray:React.PropTypes.arrayOf(

React.propTypes.shape({

name: React.propTypes.string.isRequired,

age: React.propTypes.number.isRequired,

married: React.propTypes.bool

})

)

}

07.如果想让子view实现100%的效果可以设置left:0 ,right :0,同理height可以用top:0,bottom:0

08.使用text的numberOfLines可以实现文本截取省略号,即css的text-overflow属性

09.react native里面没有z-index的概念,是根据jsx语法里面定义组件的顺序来实现的,后写的组件会覆盖在先写的组件上

UIManager

模块数据结构,JS端可访问:

UIManager.[UI组件名].[Constants(静态值)/Commands(命令/方法)]

从端上映射的方法:(部分)

·createView(int

tag, String className, int rootViewTag, ReadableMap props)

创建View

·updateView(int

tag, String className, ReadableMap props)

更新View

·manageChildren(int

viewTag, Array moveFrom, Array moveTo, Array addChildTags, Array addAtIndices,

Array removeFrom)

批量添加/删除/移动一个view下面的view

·measure(int

reactTag, Callback callback)

测量View的位置、size等,结果异步回调

·measureInWindow(int

reactTag, Callback callback)

测量View相对屏幕的位置、size等,结果异步回调

·dispatchViewManagerCommand(int

reactTag, int commandId, ReadableArray commandArgs)

派发View命令,也就是用来调用对应View的方法

这个模块是NativeModule方式定义的,在RN的JS端启动时,端上会通过JSC把收集到的模块信息(名称)打到JS端全局变量global.__fbBatchedBridgeConfig中,并采用延迟加载策略:设置NativeModules.[模块名]的getter,延迟通过JSC读取模块详细信息(方法、命令号等信息)。在调用的时候会放到MessageQueue的队列里,批量提交,两次批量提交限制的最小间隔为5ms。

10.NativeMethodsMixin 

react-native中直接访问原声组件的方法

11.array.map(function(currentValue,index,arr),thisValue)

12.react-native没有z-index的概念后写的组件在新写的上边,所以一个view中放一个图片view并不能挡住图片超出view的部分。(为图片设置与view一样的style即可)

13.用循环渲染组件

会出现key的问题例如Warning: Each child in an array or iterator should have aunique "key" prop. Check the render method ofListView.解决方法:为每个子组件添加key,但是不能重复。

14.Array.map()array.foreach()

优先级map>foreach>for

foreach的返回值并不是数组,所以不能写链式代码

15.

你可能感兴趣的:(react-native)