React快速进阶

简介: React快速进阶

上一篇文章,React入门 大致了解了, 如何基本的使用组件和更新组件. 现在,我们来点新的~

属性验证
React针对于props 专门提供了两种属性验证, 来保证组件的可复用性~ propTypes和defaultProps. propTypes用来设置属性是否必须, 类型等. defaultProps就是用来设置属性的默认值.

class Search extends Component {
constructor(){
super();
this.number = 0;
}
render() {
return(


{this.props.children}

)
}
}
Search.propTypes = {
children:PropTypes.string.isRequired
}
Search.defaultProps={
children:"default value"
}

这里,设置this.children属性是必须的,并且如果你不写的话, 他就会使用默认值,default value来替代. online demo
ok, 我们来看一下, React提供了哪几种PropType value.
from pro react

proptypes

并且,在设置类型的同时,你还可以在后面再写上isRequired这样的内容.PropTypes.array.isRequired.

还有一些其他的内容, like:

proptype desc
oneOfType 可以用来设置多种类型.PropTypes.oneOfType([PropTypes.string,PropTypes.number])
node 必须是能够渲染的类型,比如:numbers, strings, elements, or an array.
oneOf 只能是其中的某一个PropTypes.oneOf(['News', 'Photos'])
怎么写组件?
怎么写组件这个问题, 翻译一下就是,怎么使用state和props属性. 因为组件的render和state以及props是息息相关的~
比较好的实践是,state归父UI管, props归子UI管. 这里, 我们用一个简单的demo来阐述一下. 写一个搜索框~

基本样式为:

search

这个demo其实就一个中心点,通过onChange事件来控制内容信息的展示. 信息的展示,就是通过触发this.setState 方法来完成.
我这里, 就不贴代码了,直接放在online demo里了.

组件的生命周期
所谓的生命周期,实际上就是一些列触发或者不触发渲染的方法~
而涉及到这些渲染触发操作的, 大概就有4个过程:

Mounting

Unmounting

Props Change

State Change

我们来说一下,每个过程对应状态的触发顺序.

Mounting
该过程表示渲染组件的过程. 简而言之就是将我们写的组件类(class), 通过render 方法渲染到页面上. 具体触发顺序是:

Class: 已经书写好的UI 类

componentWillMount: 该方法会在render方法之前被invoke. 方法内部会设置好组件的state

render: 正式的触发方法

componentDidMount: 将节点正式渲染到页面上, 在该方法后面, 就可以实际操作DOM.

Unmounting
卸载组件的过程. 即:




渲染为:


{/ single component has been removed/}

该过程实际上只会触发一个方法:

componentWillUnmount: 在DOM即将删除之前触发该方法, 所以你可以在该方法内部做一些事件的解绑

Props Change
看名字大家差不多已经猜出来了. 该过程就是主要处理props 内容的改变. 基本的过程为:

ComponentWillReciveProps: 当组件接收到新的props便会触发该方法. 如果你在该方法内调用this.setState实际上是没有效果的.(Ps: 该方法其实并没有什么x用)

shouldComponentUpdate: 检测是否组件需要重新渲染. 实际上就是通过该方法决定, render 方法是否可以直接跳过

componentWillUpdate: 新的props和state会被接收. 并且在该方法内不能使用this.setState进行渲染(反正也无效)

render: 不解释了

componentDidUpdate: 在DOM已经完全渲染完成后,触发.

State Changes
状态属性的改变实际上和Props的流程差不多,只是是少了ComponentWillReciveProps方法.即,流程为:

shouldComponentUpdate: 检测是否组件需要重新渲染. 实际上就是通过该方法决定, render 方法是否可以直接跳过

componentWillUpdate: 新的props和state会被接收. 并且在该方法内不能使用this.setState进行渲染(反正也无效)

render: 不解释了

componentDidUpdate: 在DOM已经完全渲染完成后,触发.

lifecycle有什么用
上面说了这么多方法, 那这些方法到底是写在哪里的呢?
~~ 只能写在你的class UI中.
现在,我们要在UI渲染完成时, 弹出一个提示框,说明完成。
so how to do?
很简单.看一下代码.

class Search extends Component{
render(){
return(



)
}
componentDidMount(){
alert('finish');
}
}
这下, 应该懂了. 这里大致了解一下就行, 当做铺垫.

immutable state
因为state是起到组件渲染的关键作用. 所以, 一般外部的data都是存储在state当中, 而这样方式,即容易让你情不自禁的改动this.state中的属性. 这样很容易,造成你直接改动this.state状态会无效, 以及会降低React内部对状态渲染的性能.
所以, 建议就是,如果需要改动,请直接全部替换掉.
如果涉及到Object, 则可以使用Object.assign 或者 filter,map等方法 copy一份.

let newObj = Object.assign({},this.state.male,this.state.female);
let newArray = this.state.people.map((val)=>val);
不过,由于Object.assign支持度较低. 你可以自己手动造一个轮子.

Object.prototype.assign=function(origin,target){
for(var i in target){
if(origin.hasOwnProperty(i)){
origin[i]=target[i];
}
}
}
或者可以使用import "babel-polyfill"来做替代. 不过,这还有一个问题,就是深浅copy. 这里稍微提供点clue. 可以使用 babel-polyfill 中的update方法, 该方法可以像mongoDB一样, 将更新过后的Object, deeply copy 一份给你. 这里就不赘述了,到时候google 一下即差不多了.

动画React
React为了方便动画开发, 特地提出了React CSSTransitionGroup这个addon. 细致点来说, CSSTransitionGroup 只提供了3个效果-渲染, 新增,删除. 而且每个特效归根结底,还是需要你自己手动定义className, 他只是把className 的替换帮你做了.
so, 怎么用?
首先得下载npm:

npm install --save react-addons-css-transition-group
// 在js中引用
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
先看一个简单的demo. 这里也有线上demo:online demo

render(){
let lis = this.state.num.map((i,index)=>(

  • {i}

  • ));
    return(


    • {lis}


    )
    }
    讲真,React会在真正渲染的时候,在他应用的位置添加span元素 然后进行class的替换. 当然,如果涉及到更加复杂的动画,就需要使用css3提供的transitionend和animationend来进行设置.
    React一共提供了4个动画状态可供选择:

    Appear: 当第一次加载节点时,可以进行的动画.

    transitionAppear: 表示是否开启加载动画. 默认情况下是设置为false. 所以,如果你要时候, 需要手动开启transitionAppear={true}. 开启之后, 你就需要添加.name-appear和name-appear-active的class 动画内容.

    Enter: 当添加节点时,会触发添加动画.如果你使用的话,只需要设置.transitionEnterTimeout={timeout}即可。

    transitionEnterTimeout: 用来设置节点添加动画持续的时间,不过, 你同样需要在class 中设置相同的transition时间. 如果时间不统一, 会以React设置为主.和Appear一样,也需要手动添加name-enter类名

    Leave: 删除节点时, 触发的动画. 同上 enter. 需要手动添加transitionLeaveTimeout

    这里提一下, 关于React class Name的设置位置. 只要和渲染节点设置在一起即可.
    比如,上面的demo, 我的scss就可以设置为:

    相关文章
    |
    2月前
    |
    资源调度 前端开发 JavaScript
    React进阶学习
    React进阶学习
    15 1
    |
    4月前
    |
    前端开发 JavaScript 算法
    React——React简介和基本使用【一】
    React——React简介和基本使用【一】
    41 0
    |
    7月前
    |
    缓存 监控 前端开发
    这个知识点,是React的命脉
    这个知识点,是React的命脉
    |
    7月前
    |
    XML 存储 前端开发
    react部分知识点总结
    react部分知识点总结
    58 0
    |
    前端开发 JavaScript 算法
    【React学习】—React简介(一)
    【React学习】—React简介(一)
    |
    存储 资源调度 前端开发
    【react从入门到精通】初识React
    当今Web开发中,React已经成为最流行的JavaScript库之一,被广泛应用于构建现代、高效、可维护的用户界面。本文将带您从零开始,介绍React的基本概念和使用方法,包括组件、状态管理、事件处理、组合和嵌套组件等。无论您是刚刚入门前端开发,还是想深入了解React的高级特性,本文都将为您提供简洁明了的指导,帮助您轻松掌握React,并在您的Web应用中充分发挥其强大的潜力!
    311 0
    |
    设计模式 存储 缓存
    |
    前端开发
    react常用知识点2
    react常用知识点2
    55 0
    |
    XML 前端开发 JavaScript
    react常用知识点1
    react常用知识点1
    49 0
    |
    前端开发 JavaScript 数据建模