深入理解react 组件类型及使用场景


Posted in Javascript onMarch 07, 2019

函数组件 vs 类组件

函数组件(Functional Component )和类组件(Class Component),划分依据是根据组件的定义方式。函数组件使用函数定义组件,类组件使用ES6 class定义组件

// 函数组件
function Welcome(props) {
 return <h1>Hello, {props.name}</h1>;
}

// 类组件
class Welcome extends React.Component {
 render() {
  return <h1>Hello, {this.props.name}</h1>;
 }
}
  1. 函数组件的写法要比类组件简洁,不过类组件比函数组件功能更加强大。函数组件更加专注和单一,承担的职责也更加清晰,它只是一个返回React 元素的函数,只关注对应UI的展现。函数组件接收外部传入的props,返回对应UI的DOM描述,
  2. 类组件可以维护自身的状态变量,即组件的state,类组件还有不同的生命周期方法,可以让开发者能够在组件的不同阶段(挂载、更新、卸载),对组件做更多的控制。

无状态组件 vs 有状态组件

函数组件一定属于无状态组件 (划分依据是根据组件内部是否维护state)

// 无状态组件
class Welcome extends React.Component {
 render() {
  return <h1>Hello, {this.props.name}</h1>;
 }
}


// 有状态类组件
class Welcome extends React.Component {
 constructor(props) {
  super(props);
  this.state = {
    show: true
  }
 }
 render() {
   const { show } = this.state;
   return (
     <>
      { show && <h1>Hello, {this.props.name}</h1> }
     </>
  )
 }
}

展示型组件 vs 容器型组件

展示型组件(Presentational Component)和容器型组件(Container Component),划分依据是根据组件的职责。 (展示型组件一般是无状态组件,不需要state)

class UserListContainer extends React.Component{
 constructor(props){
  super(props);
  this.state = {
   users: []
  }
 }

 componentDidMount() {
  var that = this;
  fetch('/path/to/user-api').then(function(response) {
   response.json().then(function(data) {
    that.setState({users: data})
   });
  });
 }

 render() {
  return (
   <UserList users={this.state.users} />
  )
 }
}

function UserList(props) {
 return (
  <div>
   <ul className="user-list">
    {props.users.map(function(user) {
     return (
      <li key={user.id}>
       <span>{user.name}</span>
      </li>
     );
    })}
   </ul>
  </div>
 ) 
}

展示型组件和容器型组件是可以互相嵌套的,展示型组件的子组件既可以包含展示型组件,也可以包含容器型组件,容器型组件也是如此。例如,当一个容器型组件承担的数据管理工作过于复杂时,可以在它的子组件中定义新的容器型组件,由新组件分担数据的管理。展示型组件和容器型组件的划分完全取决于组件所做的事情。

总结

通过上面的介绍,可以发现这三组概念有很多重叠部分。这三组概念都体现了关注点分离的思想:UI展现和数据逻辑的分离。函数组件、无状态组件和展示型组件主要关注UI展现,类组件、有状态组件和容器型组件主要关注数据逻辑。但由于它们的划分依据不同,它们并非完全等价的概念。它们之间的关联关系可以归纳为:函数组件一定是无状态组件,展示型组件一般是无状态组件;类组件既可以是有状态组件,又可以是无状态组件,容器型组件一般是有状态组件。

举个?

import React, { Component } from 'react'
import { observer } from 'mobx-react'
import { Switch } from 'antd'

@observer
class BaseInfoView extends Component {
 constructor(props) {
  super(props)
 }

 render() {
  const {
   ideaName,
   resourceLocationDto,
   switchState,
   slotId
  } = this.props.model

  return (
   <div>
    <div className="adx-form-item-title">基本信息</div>
    <div className="ant-form-horizontal">
     <div className="ant-form-item region">
      <label className="ant-col-4 ant-form-item-label">
       <span className="require-tip">*</span>创意名称:
      </label>
      <div className="ant-col-19 ml10 region-input">
       <div className="ant-form-text">
        { ideaName }
       </div>
      </div>
     </div>

     <div className="ant-form-item region">
      <label className="ant-col-4 ant-form-item-label">
       <span className="require-tip">*</span>所属资源位:
      </label>
      <div className="ant-col-19 ml10 region-input">
       <div className="ant-form-text">
        { resourceLocationDto && resourceLocationDto.resourceName }
       </div>
      </div>
     </div>

     <div className="ant-form-item region">
      <label className="ant-col-4 ant-form-item-label">
       <span className="require-tip">*</span>创意状态:
      </label>
      <div className="ant-col-19 ml10 region-input">
       <div className="ant-form-text">
        <Switch checked={switchState == 1}/>
       </div>
      </div>
     </div>

     <div className="ant-form-item region">
      <label className="ant-col-4 ant-form-item-label">
       <span className="require-tip">*</span>推啊广告位ID:
      </label>
      <div className="ant-col-19 ml10 region-input">
       <div className="ant-form-text">
        { slotId }
       </div>
      </div>
     </div>
    </div>
   </div>
  )
 }
}

export default BaseInfoView

完全可以写成函数组件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS模拟多线程
Feb 07 Javascript
解决jquery插件冲突的问题
Jan 23 Javascript
jquery模拟alert的弹窗插件
Jul 31 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
JavaScript事件详细讲解
Jun 27 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
Oct 11 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 Javascript
vue+springmvc导出excel数据的实现代码
Jun 27 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
vue实现图片懒加载的方法分析
Feb 05 Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 #Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 #Javascript
Vue中的情侣属性$dispatch和$broadcast详解
Mar 07 #Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 #jQuery
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 #Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
Mar 07 #Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 #Javascript
You might like
如何打开php的gd2库
2017/02/09 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
详解python发送各类邮件的主要方法
2016/12/22 Python
Python调用C++程序的方法详解
2017/01/24 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
python实现石头剪刀布程序
2021/01/20 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python批量处理txt文件的实例代码
2020/01/13 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
基于python实现计算两组数据P值
2020/07/10 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
美国知名生活购物网站:Goop
2017/11/03 全球购物
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
生产管理的三大手法
2013/11/11 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
拖欠货款起诉状
2015/05/20 职场文书
庆七一主持词
2015/06/29 职场文书
学术研讨会主持词
2015/07/04 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书