react 项目实战(六)提取布局组件
重复代码是混乱的根源!,本篇文章我们来继续消灭重复代码。
目标
细心的同学应该能发现:每一个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 项目实战(六)提取布局组件的更多相关文章
- react 项目实战(四)组件化表单/表单控件 高阶组件
高阶组件:formProvider 高阶组件就是返回组件的组件(函数) 为什么要通过一个组件去返回另一个组件? 使用高阶组件可以在不修改原组件代码的情况下,修改原组件的行为或增强功能. 我们现在已经有 ...
- React项目实战:react-redux-router基本原理
React相关 React 是一个采用声明式,高效而且灵活的用来构建用户界面的框架. JSX 本质上来讲,JSX 只是为React.createElement(component, props, .. ...
- miniFTP项目实战六
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- react 项目实战(十)引入AntDesign组件库
本篇带你使用 AntDesign 组件库为我们的系统换上产品级的UI! 安装组件库 在项目目录下执行:npm i antd@3.3.0 -S 或 yarn add antd 安装组件包 执行:npm ...
- react 项目实战(九)登录与身份认证
SPA的鉴权方式和传统的web应用不同:由于页面的渲染不再依赖服务端,与服务端的交互都通过接口来完成,而REASTful风格的接口提倡无状态(state less),通常不使用cookie和sessi ...
- react 项目实战(八)图书管理与自动完成
图书管理 src / pages / BookAdd.js // 图书添加页 /** * 图书添加页面 */ import React from 'react'; // 布局组件 import H ...
- react 项目实战(七)用户编辑与删除
添加操作列 编辑与删除功能都是针对已存在的某一个用户执行的操作,所以在用户列表中需要再加一个“操作”列来展现[编辑]与[删除]这两个按钮. 修改/src/pages/UserList.js文件,添加方 ...
- 3、手把手教React Native实战之flexbox布局
flexbox是Flexible Box的缩写,弹性盒子布局 主流的浏览器都支持 flexbox布局是伸缩容器(container)和伸缩项目(item)组成 Flexbox布局的主体思想是元素可以 ...
- 【Flutter实战】六大布局组件及半圆菜单案例
老孟导读:Flutter中布局组件有水平 / 垂直布局组件( Row 和 Column ).叠加布局组件( Stack 和 IndexedStack ).流式布局组件( Wrap )和 自定义布局组件 ...
随机推荐
- ztree 展开一级节点 | ztree只显示到二级目录
// 默认展开一级节点var nodes = tree.getNodesByParam("level", 0);for (var i = 0; i < nodes.lengt ...
- SQLSTATE[23000]报错
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in order clause is ambiguous 这个问题在 ...
- PHP与MySQL的亲密接触
PHP与MySQL的亲密接触 此篇文章前,你应该先做好一些准备工作 1.建好一个mysql数据库,记住servername,username,password 三者缺一不可. 2.在数据库创建cr ...
- oracle分配权限 学习笔记--转载
在全局数据库ORCL下创建一个用户首先在开始-->运行——>sqlplus,然后输入 sys/change_on_install as sysdba 以sys权限登陆进去 然后可以进行操作 ...
- Elasticsearch入门和基本使用
1. 什么是Elasticsearch? Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统:Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开 ...
- Python 网络编程介绍
网络编程介绍 1. 目标: 编写一个C/S架构的软件 C/S: Client ----------- 基于网络 --------- Server B/S: Browser -------- 基于网络 ...
- centos7安装kvm虚拟机
一 centos7安装kvm虚拟机 1.验证CPU是否支持KVM 结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的. [root@centos ~]# egrep '(vmx| ...
- 81-Gator Oscillator,加多摆动指标.(2015.7.1)
Gator Oscillator 加多摆动指标 Oscillator,加多摆动指标.(2015.7.1)" title="81-Gator Oscillator,加多摆动指标.(2 ...
- ACdream 1063 字典树
ACdream 1063 字典树 平衡树 神奇的cxlove有一颗平衡树,其树之神奇无法用语言来描述 OrzOrz. 这棵树支持3种操作: 1.加入一个数到树中,维护平衡树的合法性: 2.给一个数X, ...
- 3D标签云
一.圆的坐标表达式 for(var i = 0;i < len;i++){ degree = (2*(k+1)-1)/len - 1;a = Math.acos(degree);//这样取得弧度 ...