react知识总结_六年级教学工作总结个人

react知识总结_六年级教学工作总结个人React个人入门总结《六》

大家好,又见面了,我是你们的朋友全栈君。

简介

这次要总结的是对 storereducer 的拓展,比如发送异步的 action 操作,还有一个就是对多个 reducer 的管理。

首先来总结一下 react-redux 的使用:

1. 下载 react-reduxredux 到项目中。

2. 引入 createStore 并且创建 store

<!-- reducer -->
function handleUser(state = [], action) {
  switch (action.type) {
    case 'ADD_USER':
      state.push(action.user)
      return [...state];
    case 'DELETE_USER':
      state.splice(action.payload, 1);
      return [...state];
    default:
      return state
  }
}
export { handleUser }; 

<!-- store -->
import { createStore } from 'redux';
import { handleUser } from '../Reducer/handleUser';

const store = createStore(handleUser);
export { store };
复制代码

3. 在 index.js 引入 store ,并且引入 Provider 并且将 store 传递给它。

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { store } from './Redux/Store/store';
import * as serviceWorker from './serviceWorker';
import './assets/_reset.scss';

// 引入页面
import { UserContainer } from './Pages/UserContainer';

ReactDOM.render(
  <Provider store={ store }>
    <UserContainer />
  </Provider>,
  document.getElementById('root')
)
复制代码

4. 在 UI组件 中使用 connect 获取当前状态和使用 dispatch 发送 action

<!-- action -->
const addUser = (user) => ({
  type: 'ADD_USER',
  user: user
})
const deleteUser = (index) => ({
  type: 'DELETE_USER',
  index: index
})
export { addUser, deleteUser };


<!-- pages -->
import { addUser, deleteUser } from '../Redux/Action/addUserData';
const mapStateToProps = (state) => {
  return {
    userList: userList
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    addUserData: (user) => {
      return dispatch(addUser(user))
    },
    deleteUserData: (index) => {
      return dispatch(deleteUser(index))
    }
  }
}

UserContainer = connect(mapStateToProps, mapDispatchToProps)(UserContainer);
复制代码

以上就是 react-redux 的使用,下面继续拓展其他使用方式。


combineReducers

combineReducersredux 提供的一个方法,调用这个方法并且传入多个 reducer ,然后对这些 reducer 进行管理:

import { combineReducers } from 'redux';
import { handleUser } from './handleUser';
<!-- 写法一 -->
const chatReducer = combineReducers({
  userList: handleUser,
  <!-- ...这里可以写更多 reducer -->
})

<!-- 写法二 -->
const chatReducer = combineReducers({
  handleUser,
  <!-- ...这里可以写更多 reducer -->
})

export { chatReducer };
复制代码

上面的 combineReducers 传入的对象有两个写法,但是每个写法最终呈现的名字必须要与 state 一样:

const mapStateToProps = (state) => {
  return {
    <!-- 这时 state 返回的是一个对象,里面返回各个 reducer 返回的 state -->
    userList: state.userList
  }
}
复制代码

还有一点就是 store 设置默认值的问题。

<!-- 使用 combineReducers 之前-->
const store = createStore(
  handleUser,
  state
)

<!-- 使用 combineReducers 之后-->
const store = createStore(
  chatReducer,
  { userList: state }   // 这里参数必须是个对象,而且对象里面的键要和 combineReducers 设置的相同。
)
复制代码

store 可以接受三个参数,第一个参数是 reducer ,第二个参数代表状态默认值,用于覆盖 reducer 的默认状态。

store 的第三个参数

目前的 store 并不具备处理异步 action 的能力,我们可以使用 中间件 来实现这个操作。

applyMiddlewarestore 的第三个参数,它是一个函数,用来拓展 store ,这个方法来源于 redux

  • logger
  import { createLogger } from 'redux-logger';
  const logger = createLogger();
  
  const store = createStore( chatReducer, { userList: defaultUserList }, applyMiddleware(logger));
复制代码

logger 可以在发送 action 时打印状态的变化以及 action 的信息:

  • redux-thunk
  import thunk from 'redux-thunk';
  import { createLogger } from 'redux-logger';
  const logger = createLogger();
  const store = createStore(
    chatReducer,
    { userList: defaultUserList },
    applyMiddleware(thunk, logger)
  );
复制代码

正常情况下,dispatch 传递的参数只能是对象:

addUserData: (user) => {
  return dispatch({
    type: 'ADD_USER',
    payload: user
  })
}
复制代码

使用 redux-thunkdispatch 接受一个函数,让他能够进行异步操作:

addUserData: (user) => {
  return dispatch((dispatch, getState)=> {
    setTimeout(()=> {
      dispatch(addUser(user))
    }, 2000)
  })
}
复制代码

传递一个函数之后,这个函数可以接受两个参数,一个是 dispatch ,另一个是 getState ,然后在里面进行异步操作,我这里设置了 2秒 然后添加了一个用户,点击之后,过了 2秒 我的用户才会被添加进去,而页面也是等到 2秒 后重新渲染。

这种异步思路就是使用 Action Creator 返回一个函数,然后使用 redux-thunkdispatch 能够接受一个函数作为参数。

  • redux-promise
  import thunk from 'redux-thunk';
  import { createLogger } from 'redux-logger';
  import promiseMiddleware from 'redux-promise';
  const logger = createLogger();
  const store = createStore(
    chatReducer,
    { userList: defaultUserList }, 
    applyMiddleware(thunk, promiseMiddleware, logger) // 按照严格的循序
  );
复制代码

上一种方法是使用 Action Creator 返回函数来操作异步,使用 redux-promise 可以让它返回一个 promise 对象,可以使用 then 来实现后面的操作。

deleteUserData: (index) => {
  return dispatch(new Promise((resolve, reject)=> {
    setTimeout(()=> {
      dispatch(deleteUser(index))
    }, 2000)
  }))
}
复制代码

使用 redux-promise 让它能够返回一个 使用 promise ,接着我们调用 使用 deleteUserData 函数时就可以执行 then 的操作。

总结

以上三个中间件都是对 store 的拓展,使用 applyMiddleware 并且分别传入三个 中间件 ,传入时必须要遵循顺序,否则会出问题:

applyMiddleware(thunk, promiseMiddleware, logger)
复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107035.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vim 命令备忘

    vim 命令备忘

    2021年9月8日
    57
  • SQL datetime和smalldatetime区别

    SQL datetime和smalldatetime区别datetime存储大小8个字节,精确到分后的3为小数,日期范围从1753年1月1日到9999年12月31日;而smalldatetime存储大小为4个字节,精确到分,日期范围从1900年1月1日到2079年6月6日。参考http://msdn.microsoft.com/zh-cn/library/ms187819%28v=…

    2022年7月27日
    3
  • 网络编程学习笔记一:Socket编程

    网络编程学习笔记一:Socket编程“一切皆Socket!”话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。——有感于实际编程和开源项目研究。我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有

    2022年7月13日
    12
  • 手把手教你启用Win10的Linux子系统(超详细)[通俗易懂]

    今天为大家介绍如何才能启用Windows10下的Linux子系统,废话不多说,直接看步骤:启用开发者模式打开设置点击更新和安全点击开发者选项启用开发人员模式更改系统功能使用win+X快捷键调出系统管理菜单后点击应用和功能,然后拉到底下,选择程序和功能选中应用或关闭Windows功能勾选适用于Linux的Windows子系统,然后确认并重启…

    2022年4月17日
    125
  • js正则使用变量_JavaScript正则

    js正则使用变量_JavaScript正则varcookieName=”admin”; varcookie=document.cookie; varpat=newRegExp(“^”+cookieName+”=\\w*”,”g”);//输出的正则表达式/^admin=\w*/g

    2022年9月15日
    0
  • cglib BeanCopier 使用

    cglib BeanCopier 使用cglib是一款比较底层的操作java字节码的框架。 下面通过拷贝bean对象来测试BeanCopier的特性: Java代码  public class OrderEntity {      private int id;      private String name;      // Getters and setters are o

    2022年9月5日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号