react无状态组件&受控组件&非受控组件

1,271 阅读3分钟

无状态组件

无状态组件就是只负责展示的纯组件,它的特点是不需要管理状态state,数据直接通过props传入,例如函数创建的组件是无状态组件。

function HelloComponent(props) {    return <div>{props.data}</div>}

这种组件简单清晰,容易理解,可读性较好。

但是,仅仅使用这种无状态组件现然是满足不了复杂的应用的,因此无状态组件往往需要结合高阶组件使用,利用高阶组件托管所需状态数据。例如redux中就是将组件分为容器组件ui组件,容器组件作为一个高阶组件,提供数据和行为给ui组件或者其他的容器组件,负责调用action,并作为回调给展示组件,因此容器组件通常是有状态的,往往作为数据源;而ui组件关心组件的展示,通过props接收数据和回调很少有它们自己的state,有也是UI状态而不是数据。

有状态组件

如果组件内部包含状态,并且状态随着事件或者外部的消息而发生改变,这就构成了有状态组件。使用有状态组件通常会结合react的生命周期钩子控制组件状态更新的时机。

react中,有两种更新组件的方式:props和state。props是只读的,只能由父组件控制;而state是由组件内部维护的。无状态组件通常只通过props来存储数据,而有状态组件使用state来存储数据。

受控组件&非受控组件

受控组件: react 掌握控制权, 非react的手段不能对元素进行更改. 每一个操作都在react的监控内。
非受控组件: 元素的状态不受 react 控制。

例如对于一个input组件,如果不提供value属性,或者只提供defaultVaule初始化数据属性,后续的值修改都不受react控制,则他就是一个非受控组件:

 <input type="text" />

对于受控组件,可变状态通常保存在组件的状态属性中,并且只能使用 setState() 更新,而包裹着受控表单组件的React父组件控制着在后续用户输入时该表单中发生的情况,以这种由React控制的输入表单元素而改变其值的方式,称为:“受控组件”。

<input type="text" value=this.state.value />;

个人理解的受控与非受控,关键在于站在哪个视角去看,对于一组包含关系的父子组件,如果子组件的状态不受父组件控制,而是子组件在其内部维护了自己的状态state,对于父组件来说,子组件就是一个非受控组件。相反的,如果父组件可以通过props控制子组件的展示状态,那他就是一个受控组件。

实际上,如果既在子组件内部使用state,同时保留props和onchange回调函数也是可行的,只要在componentwillreceiveprops生命周期将props应用到state上,以及通过onchange通知父组件更新数据即可。但是这样不太符合单向数据流的思想,由于受控源不止一处,如果没有严谨的利用value和onchange控制数据,容易出现状态失控、数据不一致的问题。

推荐阅读:goshakkk.name/controlled-…