看过一遍webpack/es6/react的基础之后,感觉还算不上真正入门react的实战开发,于是乎想边学边搞一个小项目、把这三webpack/es6/react结合起来用一遍,从实际小项目中反过来学习基础要点。
(react的基础学习在 前面的学习。)
全部亲手一行行敲完后,终于有了这个稍微成型的入门小实例:
完整代码github:react-todo
演示链接demo:react-todo
实践中收货良多,过后便稍微总结一下系列的笔记。
module的导入导出
module的导入
|
|
module的导出
|
|
class
直接来看MainItem.js
组件里的一个 class的结构:
|
|
类MainItem里面,定义方法不用写function
,方法之间不用写逗号 ,
;
在render
里面的dom元素可以绑定这些事件:onClick={this.deleteClick.bind(this)}
;
虚拟事件对象一般有如下这些,它们是 react 封装好的,跟浏览器本地事件很像:onKeyDown onKeyPress onKeyUp onFocus onBlur onClick onDoubleClick
等;
具体可 查阅文档
props refs
props:父组件向子组件传递数据:
|
|
ref: 获取当前组件下的真实dom:
|
|
spread操作符
Todo.js 通过 spread 向子组件 TodoMain.js 传递 count
|
|
那么,我们在 TodoMain.js 的 this.props
得到的就是一个对象:{countAll:数字, countDone:数字}。
spread 操作符 在子组件向孙组件传递父组件的数据时,特别好用。比如子组件 TodoMain.js 向 孙组件 MainItem.js 传递父组件 Todo.js 的数据:<MainItem {...this.props}/>
。
几个函数
filter
过滤,遍历数组,对每一个元素触发一个回调函数,经处理判断、保留或删除当前元素,最后返回一个新数组;
如,在 Todo.js 的 searchTasks方法中,就是通过 filter 筛选出搜索结果的:
|
|
this.todoDb.get() 得到的是一个对象为元素的数组,具体形式如下:[{'task':'任务1','isDone':true},{'task':'任务2','isDone':false}]
箭头函数无需 return 。
map
遍历数组,对每一个元素触发一个回调函数,经处理后生成新的当前元素,最后返回一个新数组;
如:在 TodoMain.js 向 MainItem.js 传递数据时就采用 map 遍历:
|
|
array1.map(callbackfn[, thisArg])
:
array1 必选 一个数组对象。
callbackfn 必选 最多可以接受三个参数的函数。
thisArg 可选
回调函数 callbackfn 语法:function callbackfn(value, index, array1)
:
Value 数组元素的值。(tasks:数组里的一个对象,如:{‘task’:’任务1’,’isDone’:true})
index 数组元素的数字索引。(index:当前元素的索引)
array1 包含该元素的数组对象。
some()、every()
遍历数组,对每一个元素触发一个回调函数,通过判断,返回一个布尔值。
some():只要有一个满足判断,就返回true,
every():只要有一项不满足判断,就返回false。
todoDb
本地数据采用 localStorage 来存取,具体详见 todoDb.js 模块:
|
|
localStorage 不能存数组,所以关键是
存的时候(set)先把数组对象转成字符串: JSON.stringify()
;
取的时候(get)先把字符串转成数组对象: JSON.parse()
。
构造函数 constructor 里先判断如果数据为空,则默认先设置一个空的数组;不然 被 map 遍历时出错(map遍历的是数组)。