20分钟搞懂Redux概念

简介: 20分钟搞懂Redux概念

一、课程目标


  • Redux 基础概念(Action、Reducer、State)


  • 异步Action的处理


  • Redux中间件原理


二、知识要点


官网 www.redux.org.cn/


1. 搭建环境


# 创建项目
npx create-react-app redux
#or
create-react-app redux


2.Redux入门


JavaScript 需要管理比任何时候都要多的 state (状态)


1.1 统一状态管理需要完成什么功能


  • 更新状态


  • 获取状态


  • 状态变更通知 - (最好是订阅发布模式)


1.2 演示


// store.js
import { createStore } from 'redux'
const action = {
    clear: { type: 'clear' },
    add: { type: 'add', payload: 1 },
}
const reducer = (state = { num: 100 }, action) => {
    switch (action.type) {
        case 'clear':
            return { num: 0 }
        case 'add':
            return { num: state.num + action.payload }
        default:
            return state
    }
}
const store = createStore(
    reducer
)
// 建立响应订阅
store.subscribe(() => console.log('update', store.getState()))
store.dispatch(action['clear'])
store.dispatch(action['add'])
//App.js
import React from 'react'
import store from './store'
class App extends React.Component{
    render(){
        return <div>
        </div>
    }
}
export default App


1.3 总结三大原则


  • 单一数据源


整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。


  • State 是只读的


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


  • 使用纯函数来执行修改


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


** **


3. 异步Action


const action = {
        // ...
    asyncAdd: dispatch => {
        setTimeout(() => {
            dispatch({ type: 'add', payload: 2 })
        }, 1000)
    }
}
// action['asyncAdd'](store.dispatch)
store.dispatch(action['asyncAdd'])


4. Redux中间件


4.1 logger 与 thunk


import { createStore, applyMiddleware } from 'redux'
const logger = ({ dispatch, getState }) => next => action => {
    console.log('start: ' ,action)
    next(action)
    console.log('end: ' ,action)
    return 
}
const thunk = ({ dispatch, getState }) => next => action => {
    if (typeof action === 'function') {
        return action(dispatch)
    }
    next(action)
    return 
}
const store = createStore(
    reducer,
    applyMiddleware(...[
        logger,
        thunk
    ])
)
// 可以利用
// import logger from 'redux-logger'
// import thunk from 'redux-thunk'
// const store = createStore(
//     reducer,
//     applyMiddleware(...[
//         logger,
//         thunk
//     ])
// )


4.2 第三方中间件


// 可以利用
import logger from 'redux-logger'
import thunk from 'redux-thunk'
const store = createStore(
    reducer,
    applyMiddleware(...[
        logger,
        thunk
    ])
)


5 与React结合


import React from 'react'
import store from './store'
import ReactDom from 'react-dom'
const render = () => {
  ReactDom.render(
    <App />,
    document.querySelector('#root')
  )
}
store.subscribe(render)
class App extends React.Component {
  render() {
    return <div><div>
      <p>{store.getState().num}</p>
      <div>
        <button onClick={() => store.dispatch({ type: "clear" })}>clear</button>
        <button onClick={() => store.dispatch({ type: "add", payload: 1 })}>add</button>
        <button onClick={() => {
          store.dispatch(dispatch => {
            setTimeout(() => {
              dispatch({ type: "add", payload: 2 })
            }, 1000)
          })
        }
        }>asyncAdd</button>
      </div>
    </div>
    </div>
  }
}
export default App


相关文章
|
存储 缓存 JavaScript
深入浅出 RxJS 核心原理(响应式编程篇)
在最近的项目中,我们面临了一个需求:监听异步数据的更新,并及时通知相关的组件模块进行相应的处理。传统的事件监听和回调函数方式可能无法满足我们的需求,因此决定采用响应式编程的方法来解决这个问题。在实现过程中发现 RxJS 这个响应式编程库,可以很高效、可维护地实现数据的监听和组件通知。
380 0
深入浅出 RxJS 核心原理(响应式编程篇)
|
1月前
|
存储 JavaScript 前端开发
Redux原理
【10月更文挑战第26天】Redux通过单一数据源、只读状态、纯函数修改状态等核心概念,以及清晰的工作流程和中间件机制,为JavaScript应用程序提供了一种强大而可预测的状态管理方案。它与React等视图库的结合能够有效地实现数据驱动的视图更新,提高应用程序的可维护性和可扩展性。在实际应用中,根据项目的具体需求和复杂度,可以灵活地运用Redux及其相关的工具和技术,来构建高效、稳定的前端应用。
82 33
|
4月前
|
JavaScript 中间件
Redux 中 Sagas 的概念
【8月更文挑战第31天】
41 0
|
存储 JavaScript 开发者
几句话带你理解Vuex基础概念
几句话带你理解Vuex基础概念
69 0
|
JavaScript 前端开发 算法
Redux和Vuex的异同点,以及用到的相同的思想
Redux和Vuex的异同点,以及用到的相同的思想
|
存储 Kubernetes API
【k8s概念】一文搞懂k8s核心概念!!!(下)
【k8s概念】一文搞懂k8s核心概念!!!(下)
53365 8
|
存储 Kubernetes 调度
【k8s概念】一文搞懂k8s核心概念!!!(上)
【k8s概念】一文搞懂k8s核心概念!!!(上)
668 0
|
Kubernetes 应用服务中间件 nginx
【k8s概念】一文搞懂k8s核心概念!!!(中)
【k8s概念】一文搞懂k8s核心概念!!!(中)
382 1
|
前端开发 JavaScript 算法
解密二叉树:探索概念、类型与常见算法的奥秘(顺带说一下React中的reconcile)
二叉树作为程序的一种数据结构,应用广泛,比如React中的reconcile过程,Fiber树的调和过程。确实,在React中,Fiber树是通过child和sibling连接子节点和兄弟节点的方式来表示的,这与普通的二叉树有所不同。 在React中,reconcile过程是将虚拟DOM转化为实际DOM的过程。通过比较新旧两棵树的差异,React可以高效地更新实际DOM,而不是每次都完全重新渲染整个DOM树。这个过程中会涉及到对Fiber树的遍历和调整,确保更新只发生在需要更新的部分。 Fiber树作为一种数据结构,可以帮助React跟踪组件的状态和变化,以及进行调度和渲染。它使用链表的形
61 1
解密二叉树:探索概念、类型与常见算法的奥秘(顺带说一下React中的reconcile)
|
JavaScript 中间件 API
redux原理是什么
redux原理是什么
97 0