无状态函数组件
创建无状态函数式组件形式是从React 0.14
版本开始出现的。它是为了创建纯展示组件,这种组件只负责根据传入的props
来展示,不涉及到要state
状态的操作。具体的无状态函数式组件,其官方指出:
在大部分React代码中,大多数组件被写成无状态的组件,通过简单组合可以构建成其他的组件等;这种通过多个简单然后合并成一个大应用的设计模式被提倡。
无状态函数式组件形式上表现为一个只带有一个render
方法的组件类,通过函数形式或者ES6 arrow function的形式在创建,并且该组件是无state
状态的。具体的创建形式如下:
ES5 纯函数
function HelloComponent(props) {
return <div>Hello,{props.name}</div>
}
ReactDOM.render(<HelloComponent name={"Word"}/>, document.getElementById('root'));
箭头函数
const HelloComponent= props => (
<div>Hello {props.name}</div>
)
无状态组件的创建形式使代码的可读性更好,并且减少了大量冗余的代码,精简至只有一个render方法,大大的增强了编写一个组件的便利,除此之外无状态组件还有以下几个显著的特点:
1.组件不会被实例化,整体渲染性能得到提升
因为组件被精简成一个render方法的函数来实现的,由于是无状态组件,所以无状态组件就不会在有组件实例化的过程,无实例化过程也就不需要分配多余的内存,从而性能得到一定的提升。
2.组件不能访问this对象
无状态组件由于没有实例化过程,所以无法访问组件this中的对象,例如:this.ref、this.state等均不能访问。若想访问就不能使用这种形式来创建组件
3.组件无法访问生命周期的方法
因为无状态组件是不需要组件生命周期管理和状态管理,所以底层实现这种形式的组件时是不会实现组件的生命周期方法。所以无状态组件是不能参与组件的各个生命周期管理的。
4.无状态组件只能访问输入的props,同样的props会得到同样的渲染结果,不会有副作用
无状态组件被鼓励在大型项目中尽可能以简单的写法来分割原本庞大的组件,未来React也会这种面向无状态组件在譬如无意义的检查和内存分配领域进行一系列优化,所以只要有可能,尽量使用无状态组件。[1]
React.memo()防止渲染[2]
const HelloComponent= props => (
<div>Hello {props.name}</div>
)
export default React.memo(HelloComponent)
仍可使用ref功能[3]
无状态组件内部其实是可以使用
ref
功能的,虽然不能通过this.refs
访问到,但是可以通过将ref
内容保存到无状态组件内部的一个本地变量中获取到。[1]
function CustomTextInput(props) {
// textInput must be declared here so the ref callback can refer to it
let textInput = null;
function handleClick() {
textInput.focus();
}
return (
<div>
<input
type="text"
ref={(input) => { textInput = input; }} />
<input
type="button"
value="Focus the text input"
onClick={handleClick}
/>
</div>
);
}
参考
- [1] React创建组件的三种方式及其区别
wongyun-cnblogs.com
- [2] 如何使用React.memo()
jianshu.com
- [3] 如何在React中附加无状态组件的引用ref?
stackoverflow.com