赵走x博客
网站访问量:151531
首页
书籍
软件
工具
古诗词
搜索
登录
49、Flux:理念、回顾Whinepad
48、lint、Flow、测试与复验:测试
47、lint、Flow、测试与复验:Flow
46、lint、Flow、测试与复验:ESLint
45、lint、Flow、测试与复验:package.json
44、构建实例应用:<Whinepad>
43、构建实例应用:应用配置
43、构建实例应用:<Excel>:改进的新版本
42、构建实例应用:组件:对话框
41、构建实例应用:组件:Actions
39、构建实例应用:表单:Form
38、构建实例应用:表单:<FormInput>“工厂组件”
37、构建实例应用:表单:Rating组件
36、构建实例应用:表单:Suggest
35、构建实例应用:Button组件
34、构建实例应用:组件
33、构建实例应用:Whinepad v.0.0.1
32、发布
31、开始构建
30、安装必备工具
29、为应用开发做准备:一个模板应用
28、JSX 和表单
27、JSX 和HTML 的区别
26、在JSX 中返回多个节点
25、展开属性
24、HTML 实体
23、JSX入门
22、Excel:一个出色的表格组件:下载表格数据
21、Excel:一个出色的表格组件:即时回放
20、Excel:一个出色的表格组件:搜索
19、Excel:一个出色的表格组件:编辑数据
18、Excel:一个出色的表格组件:排序
17、Excel:一个出色的表格组件
16、 PureRenderMixin
15、 性能优化:避免组件更新
14、 生命周期示例:使用子组件
13、组件生命周期示例:使用mixin
12、组件:生命周期方法
11、中途改变属性
10、从外部访问组件
9、在初始化state 时使用props:一种反模式
8、 props 与state
7、关于DOM 事件的说明
6、组件:带状态的文本框组件
5、组件的state
4、组件的propTypes
3、组件的属性
2、组件的基础
1、Hello World
50、Flux:Store
44、构建实例应用:<Whinepad>
资源编号:76098
书籍
React快速上手开发
热度:100
终于到了最后一个组件,也就是所有组件的父组件
终于到了最后一个组件,也就是所有组件的父组件(如图6-13 所示)。这个组件比Excel表格组件简单一点,依赖也更少: ``` import Button from './Button'; // <- 用于添加新条目 import Dialog from './Dialog'; // <- 用于弹出添加新条目的对话框 import Excel from './Excel'; // <- 所有内容的表格容器 import Form from './Form'; // <- 添加新条目时的表单 import React, {Component,} from 'react'; // 从 React v15.5 开始 ,React.PropTypes 助手函数已被弃用,我们建议使用 prop-types 库 来定义contextTypes。 import PropTypes from 'prop-types' ```  图6-13:Whinepad 负责CRUD 中的C 这个组件只需接收两个属性:schema 数据配置和初始数据: ``` Whinepad.propTypes = { schema: PropTypes.arrayOf( PropTypes.object ), initialData: PropTypes.arrayOf( PropTypes.object ), }; export default Whinepad; ``` 如果你已经仔细阅读了Excel 组件的实现逻辑,这个组件对你来说应该不太困难: ``` class Whinepad extends Component { constructor(props) { super(props); this.state = { data: props.initialData, addnew: false, }; this._preSearchData = null; } _addNewDialog() { this.setState({addnew: true}); } _addNew(action) { if (action === 'dismiss') { this.setState({addnew: false}); return; } let data = Array.from(this.state.data); data.unshift(this.refs.form.getData()); this.setState({ addnew: false, data: data, }); this._commitToStorage(data); } _onExcelDataChange(data) { this.setState({data: data}); this._commitToStorage(data); } _commitToStorage(data) { localStorage.setItem('data', JSON.stringify(data)); } _startSearching() { this._preSearchData = this.state.data; } _doneSearching() { this.setState({ data: this._preSearchData, }); } _search(e) { const needle = e.target.value.toLowerCase(); if (!needle) { this.setState({data: this._preSearchData}); return; } const fields = this.props.schema.map(item => item.id); const searchdata = this._preSearchData.filter(row => { for (let f = 0; f < fields.length; f++) { if (row[fields[f]].toString().toLowerCase().indexOf(needle) > -1) { return true; } } return false; }); this.setState({data: searchdata}); } render() { return (
+ add
{this.state.addnew ?
: null}
); } } ``` 要注意组件通过onDataChange 注册来监听Excel 组件中的数据变化。还要知道所有数据都只是简单地存储在localStorage 中: ``` _commitToStorage(data) { localStorage.setItem('data', JSON.stringify(data)); } ``` 此处也可以发起任何异步请求(即XHR、XMLHttpRequest、Ajax),把数据保存在服务 端,而不仅是保存在客户端。 # 总结 本章开始就提到,应用的主入口文件是app.js。这个文件既不是组件也不是模块;它没有输出任何内容。它的作用仅仅是进行初始化工作——从localStorage 中读取已存在的数据,并配置
组件: ``` 'use strict'; import Logo from './components/Logo'; import React from 'react'; import ReactDOM from 'react-dom'; import Whinepad from './components/Whinepad'; import schema from './schema'; let data = JSON.parse(localStorage.getItem('data')); // 如果localStorage中没有数据,则从schema中读取默认的示例数据 if (!data) { data = {}; schema.forEach(item => data[item.id] = item.sample); data = [data]; } ReactDOM.render(
Welcome to Whinepad!
, document.getElementById('pad') ); ``` 至此,这个应用就完成了。你可以到http://whinepad.com 进行体验,并在https://github.com/stoyan/reactbook/ 浏览完整代码。