深入理解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 Distilled 基础知识与函数
Apr 07 Javascript
jquery选择器大全 全面详解jquery选择器
Mar 06 Javascript
yepnope.js使用详解及示例分享
Jun 23 Javascript
JavaScript中对象介绍
Dec 31 Javascript
jQuery+easyui中的combobox实现下拉框特效
Feb 27 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
Oct 19 Javascript
详解JavaScript RegExp对象
Feb 04 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
vue使用drag与drop实现拖拽的示例代码
Sep 07 Javascript
详解在Javascript中进行面向切面编程
Apr 28 Javascript
JS写滑稽笑脸运动效果
May 28 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进行MySQL删除记录操作代码
2008/06/07 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
php中如何执行linux命令详解
2018/11/06 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
js分页代码分享
2014/04/28 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
javaScript产生随机数的用法小结
2018/04/21 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
简单介绍Ruby中的CGI编程
2015/04/10 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
python爬取微博评论的实例讲解
2021/01/15 Python
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
学校三节实施方案
2014/06/09 职场文书
宣传标语大全
2014/07/01 职场文书
刑事代理授权委托书
2014/09/17 职场文书
村主任当选感言
2015/08/01 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
V Rising 服务器搭建图文教程
2022/06/16 Servers