react组件设计模式

一、有状态组件、无状态组件
  • 有状态组件:有state,对数据进行操作
  • 无状态组件:无state,只负责渲染。
    无状态组件写法:
    1、纯函数,不需管理state,但会渲染重复的数据
    2、使用PureComponent,还能进行数据浅比较,简单的重复数据不会渲染
    3、react v16.6 之后有React.memo(),利用了 shouldComponentUpdate,也不要求我们写一个 class,这也体现出 React 逐步向完全函数式编程前进
 
二、HOC(高阶组件)
  实质就是一个高阶函数,只是入参从一个函数变成一个组件。
  接收一个组件,返回一个新的组件作为结果,在过程中可以对传入的组件增加包装一些新的功能。
  注意点:
  1、高阶组件不能去修改作为参数的组件,高阶组件必须是一个纯函数,不应该有任何副作用。
      2、高阶组件返回的结果必须是一个新的 React 组件,这个新的组件的 JSX 部分肯定会包含作为参数的组件。
  3、高阶组件一般需要把传给自己的 props 转手传递给作为参数的组件。
 
三、 render props
   所谓 render props,指的是让 React 组件的 props 支持函数这种模式。因为作为 props 传入的函数往往被用来渲染一部分界面,所以这种模式被称为 render props
  
1 const RenderAll = (props) => { 
2     return( 
3         <React.Fragment> 
4             {props.children(props)} 
5         </React.Fragment> ); 
6 };
7 
8 <RenderAll> {() => <h1>hello world</h1>} </RenderAll>

四、提供者模式

  解决跨多级组件传递props问题,16.3以前使用Context,之后用Provider和Consumer
虽然这个模式叫做“提供者模式”,但是其实有两个角色,一个叫“提供者”(Provider),另一个叫“消费者”(Consumer),这两个角色都是 React 组件。其中“提供者”在组件树上居于比较靠上的位置,“消费者”处于靠下的位置。比如react-redux的Provider包住了我们的App,其上的store就能被App内的所有组件共享,这就是提供者模式的运用。
 
五、组合组件
  组合组件模式要解决的是这样一类问题:父组件想要传递一些信息给子组件,但是,如果用 props 传递又显得十分麻烦。举例比如,在一组Tab中,选中一个tabItem,其余的tab也跟着状态变化,当然可以用context或者多次传递props来处理,但是用组合组件会更简单。
1 <Tabs> 
2     <TabItem>One</TabItem> 
3     <TabItem>Two</TabItem> 
4     <TabItem>Three</TabItem> 
5 </Tabs>
 1 const TabItem = (props) => { 
 2     const {active, onClick} = props; 
 3     const tabStyle = { 
 4         'max-width': '150px’, 
 5         color: active ? 'red' : 'green’, 
 6         border: active ? '1px red solid' : '0px’, 
 7     }; 
 8     return ( <h1 style={tabStyle} onClick={onClick}>   
 9              {props.children} 
10     </h1> ); 
11 };
 1 class Tabs extends React.Component { 
 2     state = { activeIndex: 0 } 
 3     render() { 
 4     const newChildren =React.Children.map(this.props.children,     
 5 (child, index) => { 
 6     if (child.type) { 
       // 拷贝Tabs的子组件并进行篡改(添加新的逻辑),然后将新的子组件返回出去
7 return React.cloneElement(child, { 8 active: this.state.activeIndex === index, 9 onClick: () => this.setState({activeIndex: index}) 10 }); 11 } else { 12 return child; 13 } 14 }); 15 return ( <Fragment> {newChildren} </Fragment> ); } 16 }
原文地址:https://www.cnblogs.com/dfzc/p/11404480.html