资讯专栏INFORMATION COLUMN

一看就懂的例子告诉你用react-redux的正确姿势

DobbyKim / 653人阅读

摘要:很多小白在看过很多教程之后仍然在敲代码的时候不清楚应该以什么样的步骤进行,那么这篇文章就一步一步分解整个过程,慢动作回放让大家看的清清楚楚明明白白。另外,中视图部分最好多带带出来,放在新建一个文件夹目录下,并被名为引用,把其他逻辑部分放后者。

whay write this: 很多小白在看过很多教程之后仍然在敲代码的时候不清楚应该以什么样的步骤进行,那么这篇文章就一步一步分解整个过程,慢动作回放让大家看的清清楚楚明明白白。

这个小Demo的功能是在input标签中输入内容,同步显示在上方的p标签内,DEMO很简单,大神们轻喷~?

项目代码在这里:https://github.com/oliyg/redu...

clone: https://github.com/oliyg/redu...

废话不多说

首先上图:

/*
                 _________               ____________               ___________
                |         |             |            |             |           |
                | Action  |------------▶| Dispatcher |------------▶| callbacks |
                |_________|             |____________|             |___________|
                     ▲                                                   |
                     |                                                   |
                     |                                                   |
 _________       ____|_____                                          ____▼____
|         |◀----|  Action  |                                        |         |
| Web API |     | Creators |                                        |  Store  |
|_________|----▶|__________|                                        |_________|
                     ▲                                                   |
                     |                                                   |
                 ____|________           ____________                ____▼____
                |   User       |         |   React   |              | Change  |
                | interactions |◀--------|   Views   |◀-------------| events  |
                |______________|         |___________|              |_________|
*/

图片来源:[redux-tutorial](https://github.com/happypoulp/redux-tutorial/blob/master/00_introduction.js)

上图是大家再熟悉不过的redux数据流,从这个图中我们可以按照下面这个流程来敲代码:

component(渲染UI) -> action(定义用户操作动作) -> reducer(处理action动作) -> store(处理reducer绑定state和dispatch) -> component(用connect绑定component、用Provider重新渲染UI) -> ...

这里使用了create-react-app安装并start后把一些没用的文件清理掉,增加我们自己的文件

文件目录如下:

src
    component/
        Texture.js
    action/
        action.js
    reducer/
        reducer.js
    store/
        store.js
    App.js
    

好,目录文件大概就是这样子,正式开始敲代码

我的位置:component/Texture.js

首先从component开刀(View视图):

引入必要的依赖:

import React from "react";

创建component(这里省去了propsTypes和defaultProps,仅仅为了方便展示):

const Texture = (props) => (
  

{props.str}

);

我的位置action/action.js

然后定义action,在这个例子中,我们只有一个动作,修改input值:onChange,在action中命名为onChangeAction,并传入一个参数e,返回包含type和value值的对象,最后暴露模块:

const onChangeAction = (e) => (
  {
    type: "INPUTCHANGE",
    value: e.target.value
  }
);

export default onChangeAction;

我的位置reducer/reducer.js

定义完action之后,我们自然是想办法处理这个action,那么下一步就是创建reducer:

reducer接收两个参数,并返回新的state,第一个参数state要先设置初始值,否则返回undefined,第二个参数action,接收可能接收到的action参数。

state中设置我们在component中要用到并绑定在视图中显示的props值,就是此前定义的str和placeholder

在reducer内部,需要用到switch检测action的type并根据不同的type来处理相应的action

需要注意的是,我们必须要记得在default情况下返回state,否则若无匹配的action.type,state就会丢失。

const reducer = (state = { str: "✒️write something: ", placeholder: "here?" }, action) => {
  switch (action.type) {
    case "INPUTCHANGE":
      return {
        str: action.value
      };
    default:
      return state;
  }
};

export default reducer;

我的位置:store/store.js

我们知道reducer存在于store内,既然action和reducer都配置好了,接下来就轮到store了

引入redux中createStore模块和之前定义好的reducer,创建store:

import { createStore } from "redux";
import reducer from "../reducer/reducer";
const store = createStore(reducer);

export default store;

我的位置:component/Texture.js

处理完成后我们再回到component中:

这么一来,我们只需要将store中的state和dispatch分别绑定在component中即可打通store中的state和component中的props的联系了,那么我们只需要react-redux提供的connect和Provider即可:

导入相关模块:

import { Provider, connect } from "react-redux";
import store from "../store/store";
import onChangeAction from "../action/action";

创建mapStateToProps和mapDispatchToProps两个函数:

const mapStateToProps = (state) => {
  return ({
    str: state.str,
    placeholder: state.placeholder
  });
};
const mapDispatchToProps = (dispatch) => {
  return ({
    onChange: (e) => { return dispatch(onChangeAction(e)) }
  });
};

并将这俩货和store通过connect和Provider绑定到视图中:

const TextureConnect = connect(mapStateToProps, mapDispatchToProps)(Texture);
const TextureWrapper = () => (
  
    
  
);
export default TextureWrapper;

我的位置:App.js

最后,大功告成,在App.js中引入这个组件即可。

//requirement
import React from "react";
import TextureWrapper from "./component/Texture";

const App = () => (
  
);

export default App;

另外,component/Texture.js中视图部分最好多带带出来,放在新建一个文件夹view目录下,并被名为TextureContainer.js引用,把其他逻辑部分放后者。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83575.html

相关文章

  • 2017-06-23 前端日报

    摘要:前端日报精选大前端公共知识梳理这些知识你都掌握了吗以及在项目中的实践深入贯彻闭包思想,全面理解闭包形成过程重温核心概念和基本用法前端学习笔记自定义元素教程阮一峰的网络日志中文译回调是什么鬼掘金译年,一个开发者的好习惯知乎专 2017-06-23 前端日报 精选 大前端公共知识梳理:这些知识你都掌握了吗?Immutable.js 以及在 react+redux 项目中的实践深入贯彻闭包思...

    Vixb 评论0 收藏0
  • 一看Java线程池分析详解

    摘要:任务性质不同的任务可以用不同规模的线程池分开处理。线程池在运行过程中已完成的任务数量。如等于线程池的最大大小,则表示线程池曾经满了。线程池的线程数量。获取活动的线程数。通过扩展线程池进行监控。框架包括线程池,,,,,,等。 Java线程池 [toc] 什么是线程池 线程池就是有N个子线程共同在运行的线程组合。 举个容易理解的例子:有个线程组合(即线程池,咱可以比喻为一个公司),里面有3...

    Yangder 评论0 收藏0
  • 一看JS抽象语法树

    摘要:前言是现在几乎每个项目中必备的一个东西,但是其工作原理避不开对的解析在生成的过程,有引擎,早期了项目,了解这个之前我们先来看看这种引擎解析出来是什么东西。 前言 babel是现在几乎每个项目中必备的一个东西,但是其工作原理避不开对js的解析在生成的过程,babel有引擎babylon,早期fork了项目acron,了解这个之前我们先来看看这种引擎解析出来是什么东西。不光是babel还有...

    HackerShell 评论0 收藏0
  • 一看javascript全等于与等于

    Javascript只有六个假值(用在条件if的判断) showImg(https://segmentfault.com/img/bVLiHL?w=424&h=346); 全等于 类型不同,返回false类型相同,则 showImg(https://segmentfault.com/img/bVLiHS?w=476&h=341); 等于 类型相同:同上=== 类型不同:尝试类型转换==【不是真值和...

    Apollo 评论0 收藏0
  • 一看module.exports/exports与module.export/export d

    摘要:命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。意思是导出的不是一个具体的数值,而是一个对象命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块对外接口的名称相同。 一、module.exports与exports nodeJS采用commonJs规范,当前文件是一个模块(module)私有域,通过exports属性导出,通过re...

    ZoomQuiet 评论0 收藏0

发表评论

0条评论

DobbyKim

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<