重复代码是混乱的根源!,本篇文章我们来继续消灭重复代码。

目标

细心的同学应该能发现:每一个Page组件(/src/pages下的组件)的render方法都拥有相似的jsx结构,比如:

render () {return (<div><header><h1>...</h1></header><main>...</main></div>);
}

每一个页面都包含一个页面的标题(header标签和h1标签),并且页面的主要部分都被放在了一个main标签中。

现在很多网站的设计都是如此:大部分页面都有相似的header和footer,不同的是中间部分的内容。

既然是这些部分都是相似的,那么在每一个地方都重复写一遍就显得太没水平了,stupid!

怎么用一份代码来渲染这些相同的地方,并且也能够满足不同的页面之间一些差异化的配置呢(如本文中各页面标题不同)?

传统的MVC Web应用可以通过模板引擎的模板页(layout)来达到这样的效果。

使用React,我们可以使用布局组件来解决这个问题。

布局组件

新建/src/layouts目录用来存放布局组件,新建HomeLayout.js文件:

/*** 布局组件*/
import React from 'react';class HomeLayout extends React.Component {render() {// 父组件传递的值const { title, children } = this.props;return (<div><header><h1>{title}</h1></header><main>{children}</main></div>);}
}export default HomeLayout;

我们把每个页面中通用的部分提取到了HomeLayout组件中,在HomeLayout中使用props.title来维护页面的标题文本。

使用props.children来渲染每个页面特有的内容部分。

现在我们可以这样来渲染HomePage:

<HomeLayout title="Welcome"><Link to="/user/list">用户列表</Link><br/><Link to="/user/add">添加用户</Link>
</HomeLayout>

HomeLayout里面的内容会作为HomeLayout的props.children渲染到最终的页面上。

重构页面组件

主页

...
import HomeLayout from '../layouts/HomeLayout';class Home extends React.Component {render () {return (<HomeLayout title="Welcome"><Link to="/user/list">用户列表</Link><br/><Link to="/user/add">添加用户</Link></HomeLayout>);}
}
...

用户添加页面

...
import HomeLayout from '../layouts/HomeLayout';class UserAdd extends React.Component {handleSubmit (e) { ... }render () {...return (<HomeLayout title="添加用户"><form onSubmit={(e) => this.handleSubmit(e)}>...</form></HomeLayout>);}
}
...

用户列表页面

...
import HomeLayout from '../layouts/HomeLayout';class UserList extends React.Component {constructor (props) { ... }componentWillMount () { ... }render () {...return (<HomeLayout title="用户列表"><table>...</table></HomeLayout>);}
}
...

总结

现在我们已经把3个页面组件的重复部分使用HomeLayout来替代了,是不是觉得代码又变得干净了很多呢?

.

转载于:https://www.cnblogs.com/crazycode2/p/8532916.html

react 项目实战(六)提取布局组件相关推荐

  1. SpringBoot+MyBatis+MYSQL项目实战六(新增收货地址)

    SpringBoot+MyBatis+MYSQL项目实战六(新增收货地址) 项目源码地址:电脑商城实战 点击新增收货地址 一:新增收货地址--数据表的创建 CREATE TABLE t_address ...

  2. miniFTP项目实战六

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  3. react项目实战-好客租房

    一.项目介绍 好客租房-移动Web端 项目介绍:本项目是一个在线租房项目,实现了类似链家等项目的功能,解决了用户租房的需求 核心业务:在线找房(地图,条件搜索),用户登录,房源发布 技术栈 React ...

  4. React简介、虚拟DOM、Diff算法、创建React项目、JSX语法、组件、组件声明方式、组件传值props和state、组件的生命周期

    React简介: 前面只是简单介绍移动APP开发,后面还会继续深入介绍移动app开发:其中想要用ReactNative开发出更出色的应用,那么就得学好React,下面将介绍React: React 是 ...

  5. 【Flutter实战】六大布局组件及半圆菜单案例

    老孟导读:Flutter中布局组件有水平 / 垂直布局组件( Row 和 Column ).叠加布局组件( Stack 和 IndexedStack ).流式布局组件( Wrap )和 自定义布局组件 ...

  6. umi搭建react+antd项目(六)父子组件通讯

    上一篇写了一个子组件,只是把值传入进来,这篇讲解在子组件修改父组件的数据 1.在index.js里,新增方法:updateImg 用于修改list集合 updateImg() {this.setSta ...

  7. React项目实战之租房app项目(四)长列表性能优化城市选择模块渲染列表

    前言 目录 前言 一.长列表性能优化 1.1 概述 1.2 懒渲染 1.3 可视区渲染(React-virtualized) 二.react-virtualized组件 2.1 概述 2.2 基本使用 ...

  8. React项目实战之租房app项目(二)首页模块

    前言 目录 前言 一.首页路由处理 二.轮播图 2.1 轮播图效果图 2.2 拷贝轮播图组件代码 2.3 轮播图代码详解 2.4 轮播图代码重构 2.5 解决轮播图出现的BUG 三.导航菜单 3.1 ...

  9. React项目实战之租房app项目(十)个人中心模块登录访问控制项目打包部署上线

    前言 目录 前言 一.个人中心模块 1.1 个人中心模块效果图 1.2 个人中心模块基础布局 1.2 个人中心模块功能实现 1.2.1 判断用户是否登陆 1.2.2 退出功能 二.登录访问控制 2.1 ...

最新文章

  1. EXECL使用技巧(转)
  2. #include algorithm 常用函数
  3. 通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书)
  4. 为什么font-family最后都会加上sans-serif字体?
  5. CodeForces - 1058A. In Search of an Easy Problem
  6. ajax会占用服务器端内存吗,javascript - 为什么不允许在jquery datatable服务器端处理ajax成功使用? - 堆栈内存溢出...
  7. ROS学习笔记(八): ROS通信架构
  8. 华为车规芯片麒麟990A架构曝光
  9. SCOM管理包模板的介绍及使用
  10. Android开发技术周报 Issue#77
  11. 安捷伦$8000万投资下一代测序公司
  12. Java web简单注册和登陆项目案例
  13. Go语言实战抽奖系统
  14. Axure手机原型图总结
  15. 《多媒体技术与应用》练习题
  16. 栈和队列的共同处和不同处
  17. 带你玩转 3D 检测和分割(一):MMDetection3D 整体框架介绍
  18. python读取pcd文件_Python读取pcd点云文件
  19. mysql显示中文乱码问题解决办法(部分情况下适用)
  20. 1dB压缩点(1dB Compression Point (P1dB Point))

热门文章

  1. 机器学习面试题集 - 如何进行 A/B 测试
  2. SAP HUM 拆包之后的HU号码依旧存在
  3. SAP WM LRFMD中Variant参数的影响初探
  4. vscode使用markdown语言编写文本
  5. 2型文法:基于预测分析表的自顶向下语法分析
  6. 重磅!2020年度人类社会发展十大科学问题发布
  7. 31页官方PPT,回顾史上最大芯片WSE:科技的壮丽美感!
  8. 两种超级智能,哪一个对人类未来影响更为深远?
  9. 李剑锋:意识科学就在身边
  10. 大牛预测2018年深度学习走向:大批AI硬件初创将失败