function List (props) {
return <div>我是一个函数式定义的react组件</div>
}
② ES5方式 React.createClass 定义的组件(该方式已经被废弃,官方文档推荐是用①和③)
③ ES6 方式定义的组件(Class Components)
class List extends React.Component {
render() {
return <div>我是一个es6方式定义的react组件</div>
}
}
官方文档写的还是颇具神秘感的,先告诉我们①和③方式在 UI 渲染效果是一毛一样的,但是'Classes have some additional features...' Class 这种方式比 Functional 这种方式多了些不一样的地方。那么问题来了。多了哪些不一样的呢? 不一样的地方你可能也发现了,有无 state,有无生命周期...等
如果你没添加上 key 属性的话,会报一个警告: Warning: Each child in an array or iterator should have a unique "key" prop...
keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识
之所以需要key,因为react 是非常高效的,它会借助元素的 key 值来判断该元素是新创建的,或者移动(交换位置)而来的,从而减少不必要的元素重渲染。更直观一点儿就是 react 很懒,能复用的元素就复用,他不想重新创建新的元素。
那么,如果上面代码 key={index} 呢?你会发现也不会有warning,但是这样做的效率是非常非常非常低的。
看看以下例子:
1. react component有几种写法?分别是什么?
① 函数式定义的无状态组件(Stateless Functional)
性能更高效、代码更简洁 没有 state,也就是无状态 不需要管理/维护 组件的生命周期 纯函数,相同的 props 会得到同样的UI渲染结果
② ES5方式 React.createClass 定义的组件(该方式已经被废弃,官方文档推荐是用①和③) ③ ES6 方式定义的组件(Class Components)
官方文档写的还是颇具神秘感的,先告诉我们①和③方式在 UI 渲染效果是一毛一样的,但是'Classes have some additional features...' Class 这种方式比 Functional 这种方式多了些不一样的地方。那么问题来了。多了哪些不一样的呢? 不一样的地方你可能也发现了,有无 state,有无生命周期...等
2.那什么时候该用 Stateless Functional 什么时候用 Class 呢?
推荐使用 Functional,能用 Functional 就用 Functional,就酱。 多说一句。Class 是用来创建包含状态生命周期和用户交互的复杂组件,而当组件只是用来纯展示或者 props 传递渲染时(展示性),二话不说请用 Stateless Functional 来快速创建组件。
3.无状态组件(Stateless Functional)有哪些优缺点
缺点 无生命周期函数。对于一个函数而言应该是谈不上生命周期。当然了,我们其实可以使用高阶组件去实现生命周期。 没有 this。在Stateless中 this 是 undefined 。
4.React.Component 绑定方法的几种方法?
<button onClick={() => this.handleClick(id)} /> <button onClick={this.handleClick.bind(this, id)} />
class Welcome extends Component { ... }
@MyContainer class Welcome extends Component { ... } export default Welcome
// list = [a, b, c, d]