react+redux+generation-modation脚手架添加一个todolist
TodoList
1. 编写actions.js
2. 分析state
试着拆分成多个reducer
3. 了解store
store.getState()store.dispatch(action)store.subscribe(listener)注册监听器调用store.subscribe(listener)返回的函数来注销监听器
4. 了解redux数据流生命周期
store.dispatch(action);- store调用传入的reducer。
- 根reducer将多个子reducer输出的state合成一个单一的state树。
- store保存了根reducer返回的state树。
5. 分析容器组件和展示组件
在这里,我遇到了很多问题。展示组件就没有什么好说的了,主要是容器组件。
搞清楚,数据到底是如何流动的?
下面举例:
- React组件上有一个点击事件。
- 当点击之后,点击事件对应一个dispatch(actionCreator())。
- store会将actionCreator()返回的action以及当前的state传递给reducer。
- reducer收到action,然后根据action.type更新state,并且返回新的state。
- store保存新的state。
- state更新后,组件调用render()方法。
那么问题来了:
由于展示组件,没有数据,那么数据该是如何来的?
回答:数据是从存放在state里的,如何将state里的数据,传递给展示组件呢?使用connect()函数,它接受两个参数,两个参数分别是函数。
function mapStateToProps(state) {
return {
todos: selectTodos(state.main.todos, state.main.visibilityFilter),
visibilityFilter: state.main.visibilityFilter,
};
}
function mapDispatchToProps(dispatch) {
return {
onAddClick: text => dispatch(addTodo(text)),
onFilterChange: nextFilter => dispatch(setVisibilityFilter(nextFilter)),
};
}
class Main extends Component {
render() {
return (
<AddTodo
onAddClick={this.props.onAddClick}
/>
<VisibleTodoList />
<Footer
onFilterChange={this.props.onFilterChange}
visibilityFilter={this.props.visibilityFilter}
/>
);
}
}
Main.propTypes = {
onAddClick: PropTypes.func.isRequired,
onFilterChange: PropTypes.func.isRequired,
visibilityFilter: PropTypes.oneOf([
'SHOW_ALL',
'SHOW_ACTIVE',
'SHOW_COMPLETED',
]);
};
export default connect(mapStateToProps, mapDispatchToProps)(Main);
- 上面的demo,是将Main作为一个展示组件。
- 将
mapStateToProps和mapDispatchToProps注入到Main里。 - 所以在
Main组件里,就可以使用注入的方法和属性了。 - 值得注意的地方,在Main里使用的props都要进行检测,也就是下面的
Main.propTypes。 - 除了将注入和组件写在一个js文件里,还可以将它们分开写。
- 就比如VisibleTodoList和TodoList分别写。然后将2个函数注入到TodoList里去。
- 对了,初始化的state是写在reducer里的,因为无论如何都会去调reducer。
在做的过程中,我还遇到了一个问题,它在几个地方三番五次的阻挠我。
// 代码里,我是这么获取state的数据的。
state.todos:
state.visibleFilter;
// 但是事实上,使用的脚手架里,它对app包了一层路由,它在最外层的reducer里的代码是这样的。
import main from 'containers/Main/reducer';
export default function createReducer(asyncReducers) {
return combineReducers(
main,
routing: routerReducer,
...asyncReducers,
);
}
// 所以我本身拿到的state是包含了main和routing这两个对象的。因此我要拿我组件里的state的数据,应该下面这样:
state.main.todos;
state.visibleFilter;
6. 编写展示组件的代码
- class类
- 每个组件都要对propTypes进行验证
- 要export
7. 编写容器组件
- 定义
mapStateToProps()将当前的state映射到组件的props, 读取state操作。 - 定义
mapDispatcherToProps(), 分发action操作。
- 传入dispatch方法。
- 返回期望注入到展示组件的props中的回调方法。
- 回调方法里,可以分发action。
- 使用connect()方法。
export default const VisibleTodoList = connect(
mapStateToProps,
mapDispatcherToProps,
)(TodoList);
// TodoList为要被注入的展示组件
8. 传入store
使用React Redux里的Provider组件,将store注入到Provider组件,它可以让所有容器组件都可以访问到store。
9. 总结
当我遇到问题:
- 要沉着冷静。
- 要管理好时间。
- 别被bug或error搞的不高兴,要高兴,又有煅炼思维的机会了。
- 要思考这是为什么?
- 要搞清楚问题的本质。
- 要探究问题,探究数据的流动。
10. 参考
react+redux+generation-modation脚手架添加一个todolist的更多相关文章
- react+redux+generation-modation脚手架搭建一个todolist
TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...
- 看完阮一峰的React教程后, 我写了一个TodoList
看完阮一峰的React教程后,就自己做了这个TodoList,自己慢慢琢磨效率差了点但是作为入门小练习还是不错的. 以下是效果图:我的源码:todolistUI:bootstrap 4 一.组件化 我 ...
- ReactJS React+Redux+Router+antDesign通用高效率开发模板,夜间模式为例
工作比较忙,一直没有时间总结下最近学习的一些东西,为了方便前端开发,我使用React+Redux+Router+antDesign总结了一个通用的模板,这个技术栈在前端开发者中是非常常见的. 总的来说 ...
- 重写官方TodoList,对于初学react+redux的人来说,很有好处
虽然官网的TodoList的例子写的很详细,但是都是一步到位,就是给你一个action,好家伙,全部都写好了,给你一个reducer,所有功能也是都写好了,但是我们这些小白怎么可能一下就消化那么多,那 ...
- Redux系列02:一个炒鸡简单的react+redux例子
前言 在<Redux系列01:从一个简单例子了解action.store.reducer>里面,我们已经对redux的核心概念做了必要的讲解.接下来,同样是通过一个简单的例子,来讲解如何将 ...
- 一个 React & Redux的目录树
|-----------------------------------------| | | | React & Redux | | | |------------------------- ...
- 使用react+redux+react-redux+react-router+axios+scss技术栈从0到1开发一个applist应用
先看效果图 github地址 github仓库 在线访问 初始化项目 #创建项目 create-react-app applist #如果没有安装create-react-app的话,先安装 npm ...
- react用脚手架创建一个react单页面项目,react起手式
官网地址:https://react.docschina.org/ 确保本地安装了Node.js node的版本大于8.10 npm的版本大于5.6 1.在本地的某个位置创建一个文件夹,执行以下 ...
- angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”
曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular开发者,我来吐槽一下react+redux的复杂. 例子 为了让大家看得舒服,我用最简单的一个demo来展示r ...
随机推荐
- android:layout_gravity和android:gravity属性的区别1
一.介绍: gravity的中文意思就是"重心",就是表示view横向和纵向的停靠位置 (1).android:gravity:是对view控件本身来说的,是用来设置view本身的 ...
- Django REST framework使用ViewSets的自定义路由实现过程
在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...
- 使用Func<>和Action简化委托
/// <summary> /// 入口 /// </summary> public void Run() { TestDelegate t = test; t(); Acti ...
- 分离数据库时出错:无法对数据库'XXX' 执行删除,因为它正用于复制"的解决方法
出现的原因是要分离的数据库是一个发布订阅的数据库.因为正在复制,所以无法脱机. 解决办法是停止发布订阅,或者删掉它..再分离.有部分情况是在复制目录下并没有看到发布订阅. 有可能是因为以前建立发布订阅 ...
- 【好记性不如烂笔头】死锁之java代码
死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称 ...
- letter-spacing+first-letter实现按钮文字隐藏
本文地址:http://www.zhangxinxu.com/wordpress/?p=3557 一.文不在长,有货则灵 图片式按钮的文字隐藏看来是大家都比较关注的一个问题(分享讨论.微博转发等可见一 ...
- java安装1335错误解决办法(亲测)
心血来潮想了解一下java,结果一开始就碰到了让心"恶心"的1335错误. 废话不多说,直接看下面: 你可以先尝试在这个链接下载java.exe文件 http://www.orac ...
- 使用cmd命令打开Python文件式程序方法
首先:需要确定已编好的Python程序的存储路径:(即在哪个磁盘,哪个文件中) 其次:打开cmd命令,输入该程序所在磁盘,敲回车键:(例如其存储在E盘,则输入“E:”,敲回车键.) 然后:输入pyth ...
- pacejs进度条监控服务端数据加载是否完毕
记得刚刚入职新公司的时候,公司在做app里面的h5页面.跟之前公司的流程不太一样.之前都是写完静态页面后通过ajax加载接口数据,这公司省事了,写完静态页面直接扔给服务端,他们来填数据,确实给前端省事 ...
- CSS前端开发学习总结、一
1. 属性选择器: 2. CSS伪类选择器: 3. CSS伪元素: 4. CSS优先级: 5. 行内标签: 6. 块级标签: 7. Display: 8. Line-height:行高 9. text ...