深入理解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 相关文章推荐
Javascript 学习笔记 错误处理
Jul 30 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
Sep 05 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
Dec 25 Javascript
纯CSS3代码实现滑动开关效果
Aug 19 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
jQuery实现查找最近父节点的方法
Jun 23 Javascript
vue mixins组件复用的几种方式(小结)
Sep 06 Javascript
详解如何让Express支持async/await
Oct 09 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
Jan 27 Javascript
vue项目设置scrollTop不起作用(总结)
Dec 21 Javascript
解决layui数据表格table的横向滚动条显示问题
Sep 04 Javascript
JS+JQuery实现无缝连接轮播图
Dec 30 jQuery
如何优雅地在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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
Django添加sitemap的方法示例
2018/08/06 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
python的pstuil模块使用方法总结
2019/07/26 Python
详解Python打包分发工具setuptools
2019/08/05 Python
Python简易版图书管理系统
2019/08/12 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
教师年终个人自我评价
2013/10/04 职场文书
单位介绍信范文
2014/01/18 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript