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

目标

细心的同学应该能发现:每一个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来替代了,是不是觉得代码又变得干净了很多呢?

.

react 项目实战(六)提取布局组件的更多相关文章

  1. react 项目实战(四)组件化表单/表单控件 高阶组件

    高阶组件:formProvider 高阶组件就是返回组件的组件(函数) 为什么要通过一个组件去返回另一个组件? 使用高阶组件可以在不修改原组件代码的情况下,修改原组件的行为或增强功能. 我们现在已经有 ...

  2. React项目实战:react-redux-router基本原理

    React相关 React 是一个采用声明式,高效而且灵活的用来构建用户界面的框架. JSX 本质上来讲,JSX 只是为React.createElement(component, props, .. ...

  3. miniFTP项目实战六

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

  4. react 项目实战(十)引入AntDesign组件库

    本篇带你使用 AntDesign 组件库为我们的系统换上产品级的UI! 安装组件库 在项目目录下执行:npm i antd@3.3.0 -S 或 yarn add antd 安装组件包 执行:npm ...

  5. react 项目实战(九)登录与身份认证

    SPA的鉴权方式和传统的web应用不同:由于页面的渲染不再依赖服务端,与服务端的交互都通过接口来完成,而REASTful风格的接口提倡无状态(state less),通常不使用cookie和sessi ...

  6. react 项目实战(八)图书管理与自动完成

    图书管理 src / pages / BookAdd.js   // 图书添加页 /** * 图书添加页面 */ import React from 'react'; // 布局组件 import H ...

  7. react 项目实战(七)用户编辑与删除

    添加操作列 编辑与删除功能都是针对已存在的某一个用户执行的操作,所以在用户列表中需要再加一个“操作”列来展现[编辑]与[删除]这两个按钮. 修改/src/pages/UserList.js文件,添加方 ...

  8. 3、手把手教React Native实战之flexbox布局

    flexbox是Flexible Box的缩写,弹性盒子布局  主流的浏览器都支持 flexbox布局是伸缩容器(container)和伸缩项目(item)组成 Flexbox布局的主体思想是元素可以 ...

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

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

随机推荐

  1. ztree 展开一级节点 | ztree只显示到二级目录

    // 默认展开一级节点var nodes = tree.getNodesByParam("level", 0);for (var i = 0; i < nodes.lengt ...

  2. SQLSTATE[23000]报错

    SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in order clause is ambiguous 这个问题在 ...

  3. PHP与MySQL的亲密接触

    PHP与MySQL的亲密接触   此篇文章前,你应该先做好一些准备工作 1.建好一个mysql数据库,记住servername,username,password 三者缺一不可. 2.在数据库创建cr ...

  4. oracle分配权限 学习笔记--转载

    在全局数据库ORCL下创建一个用户首先在开始-->运行——>sqlplus,然后输入 sys/change_on_install as sysdba 以sys权限登陆进去 然后可以进行操作 ...

  5. Elasticsearch入门和基本使用

    1. 什么是Elasticsearch? Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统:Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开 ...

  6. Python 网络编程介绍

    网络编程介绍 1. 目标: 编写一个C/S架构的软件 C/S: Client ----------- 基于网络 --------- Server B/S: Browser -------- 基于网络 ...

  7. centos7安装kvm虚拟机

    一 centos7安装kvm虚拟机 1.验证CPU是否支持KVM 结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的. [root@centos ~]# egrep '(vmx| ...

  8. 81-Gator Oscillator,加多摆动指标.(2015.7.1)

    Gator Oscillator 加多摆动指标 Oscillator,加多摆动指标.(2015.7.1)" title="81-Gator Oscillator,加多摆动指标.(2 ...

  9. ACdream 1063 字典树

    ACdream 1063 字典树 平衡树 神奇的cxlove有一颗平衡树,其树之神奇无法用语言来描述 OrzOrz. 这棵树支持3种操作: 1.加入一个数到树中,维护平衡树的合法性: 2.给一个数X, ...

  10. 3D标签云

    一.圆的坐标表达式 for(var i = 0;i < len;i++){ degree = (2*(k+1)-1)/len - 1;a = Math.acos(degree);//这样取得弧度 ...