React 导读(三)
前言React 导读(一) 在之前 2 篇文章中中学习到了写第一个 Web 组件以及常用的生命周期函数的使用,这篇文章将继续之前的目录,开始新的知识点补充:
这篇文章主要会介绍第6、7的知识点。 六 & 七、React 一个组件集合的简单交互以及开始一个项目的一点建议为什么要将6、7合在一起写呢?不是因为想偷懒...其实是脱离一个场景和合适的开始去规划组件等设计都是不合理的,多多少少都有点交集,所以将这 2 点融合在一起是更利于学习和理解的,到这里就已经不是太基础的内容了,基本上代码量会有所提高,但是分析依然会很细致。 这里用一个简单的表格的 做这个开始之前,首先要假设一点场景和基本需求,这样才能带着去思考如何实现以及更接近需求目标。 (1) 场景 为了更清晰的安排年前年后的工作和值班,现在要对过年期间人员请假的情况进行统计,并且进行一个简单的管理。 (2) 功能性需求
简单描述了一下,其实就之前说的几个功能。
最后做出来的效果如下(=.=没有设计,对齐就行哈):
看之前可以下载源代码对照着看,不过代码可能会不断修改 BUG,哈哈~有 BUG 不要虚,没有 BUG 我们可能就失业了。 (3) 准备工作
1. 需要用到的技术 2. 基础 UI 组件 在这个例子项目里面,组件的划分结构如下:
为什么要这样划分呢?
3. bootstrap-table 生成表格的方式 可以查看 github-bootstrap-table 的使用例子来看下使用方式,这里我用它做例子并不是说此库完全好或者不好,而是以前项目用了 bootstrap-table 然后就模仿了 columns 配置的方式,对于它 API 设计的其他部分暂时没采用。 4. 项目的目录规划 ├── public │ ├── favicon.ico │ ├── index.html │ └── manifest.json ├── server // 网站后端的目录,这里我们不需要关系 ├── src // 前端的源代码目录 │ ├── App.js // App 的入口组件 │ ├── apis // API 请求层的相关文件,Ajax 的方法也是需要适配的,比如常见的拦截器做法 │ ├── app.css │ ├── assets // 一些静态资源 │ ├── components // 包含了业务组件、模块组件、展示组件,这里项目较小的时候不需要划分太细,但是要有这样的分层来组织代码 │ ├── containers // 容器组件,主要的副作用等逻辑组件,基本上是数据初始化、维护一个较顶层的数据入口 │ ├── index.css │ ├── index.js // 网站的入口 JS 文件,主要是负责组件挂载到 DOM,或者你也可以做一些全局注入的一些操作 │ ├── normalize.css │ ├── registerServiceWorker.js │ ├── smarty // 基础组件的目录,这里我叫它 smarty,命名空间使用 st-,这个随你高兴 │ ├── stores // 数据操作的主要聚焦地方,每一个 Store 都能是一个事件订阅者,用于连接 React View 组件 │ └── utils // 一些工具辅助函数,目前我这里没有使用,真实项目肯定会用上的 (4) 开始思考要如何开始写代码
要解决第一个问题,假设我们的容器组件叫 class App extends Component { render() { return ( <div className="App"> <EmployeeManage /> </div> ); } } 好了,假设这样会出现最初的那个效果图的样子,那么数据并不想写的太过于零散,所以我定义了一个 // 用下自带的,你也可以自己实现一个简单的 import EventEmitter from 'events'; import assign from 'object-assign'; const state = {}; const EmployeeStore = assign({},EventEmitter.prototype,{ // 把容器组件的 this.state 在这里管理 getState() { return state; } }); 原始是原始了一点,但是应该很好理解,那就是我的 class EmployeeManage extends React.Component { constructor() { super(); // 看这里 this.state = EmployeeStore.getState(); } } 连接了这个基础的东西,我们的
看图可能就更直观的知道数据和组件之间的关系了,用过 我们现在来订阅一个名为 componentDidMount() { EmployeeStore.on('updateList',this.handleUpdateList); } componentWillUnMount() { EmployeeStore.off('updateList',this.handleUpdateList); } handleUpdateList(list) { this.setState(prevState => { return { list: list,}; }); } 这三个方法能跟上面的图对应一下,就对应上了 getList() { // API 请求列表数据的方法,返回一个 Promise EmployeeApi.get().then(result => { if(result.status === 200) { // 刚好,就通知了 EmployeeManage 说我数据获取成功了,可以更新视图了 this.emit('updateList',result.data); } }); }, 以上就完成了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |