深入理解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之ESC(第二类混淆)
May 06 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
Jul 13 Javascript
Javascript继承(上)——对象构建介绍
Nov 08 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
Jun 05 Javascript
JavaScript操作Cookie详解
Feb 28 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
原生js实现倒计时--2018
Feb 21 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
May 21 Javascript
详解Element-UI中上传的文件前端处理
Aug 07 Javascript
修改vue源码实现动态路由缓存的方法
Jan 21 Javascript
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
Apr 13 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
php5.3 废弃函数小结
2010/05/16 PHP
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
js右键菜单效果代码
2007/07/21 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
java必学必会之static关键字
2015/12/03 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
跟老齐学Python之有点简约的元组
2014/09/24 Python
Python创建文件和追加文件内容实例
2014/10/21 Python
Python实现堆排序的方法详解
2016/05/03 Python
python+Django+apache的配置方法详解
2016/06/01 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
大学生入党思想汇报
2014/01/01 职场文书
《散步》教学反思
2014/03/02 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
青岛导游词
2015/02/12 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js