React (redux store reducers(1个) reducer(1个组件1个 包含多个function函数 ) action(对象) dispatch)(react-redux redux-actions redux-immutable redux-thunk 异步redux )flux

摘要:
//Composite从“redux”导入{applyMiddleware,createStore,Composite,combineReducers};从“redux”导入{bindActionCreators};从“act-redux”redux导入{Provider}是将所有数据放入props,并通过各种连接和绑定连接props和存储。Redux获取存储中的数据并将其导入存储。使用商店。getState()方法获取stateAction作为对象。type属性是必需的,表示Action的名称。您需要创建一个Action,然后通过调度将其传递给Store。然后商店将动作转发给减速器。减速器将获得先前的状态和动作。如果商店发送更改,视图也将更改为创建reducer.js。此函数中有两个参数:state和action。
//compose 组成 combine 联合
import {applyMiddleware, createStore, compose, combineReducers} from 'redux'; 
import { bindActionCreators } from "redux";

import {Provider} from 'react-redux'

Redux则是把数据全部放到props里面,通过各种connect,bind等打通props和store的连接。

redux获取store中的数据
引入store,使用store.getState()方法,获取state

Action 是一个对象。其中的type属性是必须的,表示 Action 的名称。其他属性可以自由设置

const action = {
  type: 'ADD_TODO',
  payload: 'Learn Redux'
};
上面代码中,Action 的名称是ADD_TODO,它携带的信息是字符串Learn Redux。

可以这样理解,Action 描述当前发生的事情。改变 State 的唯一办法,就是使用 Action。它会运送数据到 Store。

(1)Reducer:纯函数,只承担计算 State 的功能,不合适承担其他功能,也承担不了,因为理论上,纯函数不能进行读写操作。

(2)Action:存放数据的对象,即消息的载体,只能被别人操作,自己不能进行任何操作。

(1)、单一数据源

整个store被储存在一个Object tree(对象树)中,并且这个Object tree只存在于唯一一个store中

(2)、state是只读的

唯一改变state的方法就是触发action,action是一个用于描述已发生事件的普通对象

(3)、使用纯函数来修改(reducer)

为了描述action如何改变state tree,你需要编写reducers

redux的工作流程
如果我们有一个组件,那么想要获取数据就需要从Store中获取数据,当组件需要改变Store数据的时候。需要创建一个Action,然后通过 dispatch(action) 传递给Store,然后Store把Action转发给Reducers. Reducers会拿到previousState(以前的state数据) 和action。然后将previousState和action进行结合做新的数据(store)修改。然后生成一个新的数据传递给Store 。Store发送改变那么View也会发生改变


创建reducer.js
这个函数里面有2个参数一个是state,另一个是action。

state指的是store中的数据

action指的是View修改数据的时候传递过来的action

这个函数必须返回一个新的数据,而且还不能对老的数据进行修改(Reducer函数中不能改变state,必须返回一个全新的对象)

我们可以先把这个state设置一个默认值defaultState。在defaultState这个对象中我们可以定义一些初始的数据

十、纯函数

同样的输入必须得到同样的输出

约束:

不得修改参数

不能调用系统I/O的API

不能调用Date.now()或者Math.random()等不纯的方法,因为每次得到值是不一样的结果 

十一、redux与flux的区别

Redux没有Dispatcher,且不支持多个store,Redux只有一个单一的store和一个根级的reducer函数。随着应有的不断变大,根级的reducer要拆分成多个小的reducers,分别独立的操作state的不同部分,而不是添加新的 stores。这就像一个 React 应用只有一个根级的组件,这个根组件又由很多小组件构成

https://segmentfault.com/a/1190000011474522?utm_source=tag-newest

https://www.jb51.net/article/137796.htm

https://segmentfault.com/a/1190000008491558

https://www.cnblogs.com/nanianqiming/p/9880391.html

https://www.cnblogs.com/nanianqiming/p/9873695.html

https://www.cnblogs.com/nanianqiming/p/9870194.html

https://blog.csdn.net/jyee721/article/details/94362580
一、安装
cnpm install --save redux-actions
 
二、为什么使用 redux-actions
reducer使用switch case语句进行action类型判断,当action很多时候,reducer内容就不那么直观了。redux-actions简化了reducer和action的联系

三、基本使用
1、创建action/actionCreator.js
import { createAction } from 'redux-actions';
export const addnum = createAction('ADDNUM')

2、组件中引入使用
import React,{Component} from "react";
import store from "./store"
import {addnum} from "./action/actionCreator"
export default class App extends Component{
  constructor(){
    super()
    this.state = store.getState();
    store.subscribe(this.handleUpdate.bind(this))
  }
  render(){
    let {n} = this.state;
    return (
      <div>
        <h2>{n}</h2>
        <button onClick={this.handleClick.bind(this)}>点击</button>
      </div>
    )
  }
  handleClick(){
    store.dispatch(addnum());
  }
  handleUpdate(){
    this.setState(store.getState())
  }
}

3、reducer中使用
import {handleActions} from 'redux-actions';
const defaultState = {
    n:10
}
export default handleActions({
    ADDNUM: (state, action) => {
        let newState = {...state};
        newState.n++;
        return newState;
    },
}, defaultState)
手动封装一个简易版的redux
export let createStore = (reducer)=>{
    //定义默认的state
    let state = {};

    //定义默认的action
    let actionTypes = "@@redux/INIT"+Math.random();
    let initAction = {type:actionTypes}

    //将所以需要监听的函数放在这个里面
    let listeners = []

    //定义getState函数
    let getState = ()=>state;

    //定义事件订阅函数
    let subscribe = (cb)=>{
        listeners.push(cb);
    }

    //定义事件派发函数 用来调用action
    let dispatch = (action=initAction)=>{
       
        //调用reducer获取新的state
        state = reducer(state,action);

        //遍历所以需要监听的函数
        listeners.map((cb)=>{
            cb();
        })
    }
    dispatch();

    return {
        getState,
        dispatch,
        subscribe
    }
}

const combineReducers = (reducers)=>{
 
  let newState = {};
  return function(state,action){
 
    for(var key in reducers){
      newState[key] = reducers[key](state[key],action)
    }
 
    return newState;
  }
}

  

免责声明:文章转载自《React (redux store reducers(1个) reducer(1个组件1个 包含多个function函数 ) action(对象) dispatch)(react-redux redux-actions redux-immutable redux-thunk 异步redux )flux》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[Unity基础]移动平台下的文件读写移动App该如何保存用户密码(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)React事件处理函数必须使用bind(this)的原因

1.JavaScript自身特性说明如果传递一个函数名给一个变量,之后通过函数名()的方式进行调用,在方法内部如果使用this则this的指向会丢失。示例代码:首先我们创建test对象并直接调用方法 : const test = { name:'jack', getName:function(){ console.log(this.name) }}test...

React Native可用的css属性

  React Native的css名称和css有点点不同,有css基础的很快上手  "alignItems",在辅轴的排列方向 flex-start | flex-end | center | stretch  "alignSelf",主容器内元素在辅轴的排列方向,同alignItems有点类似  "backfaceVisibility",  "back...

使用 ESlint+stylelint+prettier 对前端项目代码进行规范

使用 ESlint+stylelint+prettier 对前端项目代码进行规范 说明:该规范主要针对的是使用的是 react+typescript+tsx 框架的代码进行相关规范   目录 项目初始化 添加eslint相关配置及规范约束 添加prettiter 项目配置及约束 添加stylelint相关配置及约束 设置git 代码提交检查及eslint...

解决vscode开发react项目没有代码提示问题

1.安装插件 在插件库搜索:Reactjs code snippets,进行安装  2.禁用自动类型获取 打开设置,在搜索栏输入:@tag:usesOnlineServices,找到TypeScript:Disable Automatic Type Acquistion,将其禁用  3.解决JSX中tab没有自动补全 在JSX中HTML标签按tab键没...

为什么react的组件要super(props)

  对这个问题纠结了好几天,一直没时间深入研究。在segmentfault看到有人提出了同样的问题,下面这篇SF给出了解释。为什么react的组件要super(props) 解释一:  调用super的原因:在ES6中,在子类的constructor中必须先调用super才能引用this super(props)的目的:在constructor中可以使用...

umijs 开发优化和生产优化

.umirc.ts import { defineConfig } from 'umi'; import dev from './config/dev'; import prod from './config/prod'; console.log(process.env.NODE_ENV); const envConfig = 'developmen...