深入理解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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
拖动布局之保存布局页面cookies篇
Oct 29 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
Jul 03 Javascript
javascript动画浅析
Aug 30 Javascript
Javascript和Java获取各种form表单信息的简单实例
Feb 14 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
Jan 23 Javascript
深入理解JavaScript 函数
Jun 06 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
微信小程序 Tab页切换更新数据
Jan 05 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
Jul 20 Javascript
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
如何优雅地在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
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php实现网站插件机制的方法
2009/11/10 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
python字典的常用方法总结
2019/07/31 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
python的help函数如何使用
2020/06/11 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
Python hashlib模块的使用示例
2020/10/09 Python
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
保护黄河倡议书
2014/05/16 职场文书
清明节寄语2015
2015/03/23 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电