React快速进阶

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

属性验证

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

class Search extends Component {
    constructor(){
        super();
        this.number = 0;
    }
    render() {
        return(
            <div>
                <span>{this.props.children}</span>
            </div>
            )
    }
}
Search.propTypes = {
    children:PropTypes.string.isrequired
}
Search.defaultProps={
    children:"default value"
}

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

并且,在设置类型的同时,你还可以在后面再写上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来阐述一下. 一个搜索框~

基本样式为:

这个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

卸载组件的过程. 即:

<div>
    <single></single>
</div>

渲染为:

<div>
    {/* single component has been removed*/}
</div>

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

  • 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: 检测是否组件需要重新渲染. 实际上就是通过该方法决定,触发.

lifecycle有什么用

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

class Search extends Component{
    render(){
        return(
            <div>
            </div>
            )
    }
    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)=>(
                <li key={i} onClick={this.remove.bind(this,index)} >{i}</li>
            ));
        return(
            <ul>
                <CSSGroup transitionName="demo"
                        transitionEnterTimeout={300}
                        transitionLeaveTimeout={300}>
                {lis}
                </CSSGroup>
            </ul>
            )
    }

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

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

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

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

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

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

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

li {
        font-size: 15px;
        line-height: 24px;
        list-style-position: inside;
        list-style-type: disc;
        text-align: left;
        width: 80%;
        border: 1px solid;
        margin-top: 8px;
        &.demo-leave {
            opacity: 1;
            transform: translateX(0);
            &.demo-leave-active {
                opacity: 0;
                transform: translateX(250px);
                transition: 0.3s;
            }
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom