实现一个迷你Redux(基础版)

前言

本文从将从Redux原理出发,一步步自己实现一个简单的Redux,主要目的是了解Redux内部之间的联系。看本文之前先要知道Redux是怎么用的,对Redux用法不会讲解太多。

Redux介绍

首先要知道的是,Redux 和 React 没有关系,Redux 可以用在任何框架中。
Redux 是一个JavaScript 状态管理器,是一种新型的前端“架构模式”。

还有通常与redux一起用的一个库——react-redux, 它就是把 Redux 这种架构模式和 React.js 结合起来的一个库,就是 Redux 架构在 React.js 中的体现。

设计思想

  1. Web 应用是一个状态机,视图与状态是一一对应的。
  2. 所有的状态,保存在一个对象里面。

何时使用Redux

  1. 用户的使用方式复杂
  2. 不同身份的用户有不同的使用方式(比如普通用户和管理员)
  3. 多个用户之间可以协作
  4. 与服务器大量交互,或者使用了WebSocket
  5. View要从多个来源获取数据

从组件的角度看:

  1. 某个组件的状态,需要共享
  2. 某个状态需要在任何地方都可以拿到
  3. 一个组件需要改变全局状态
  4. 一个组件需要改变另一个组件的状态

Redux工作流程

  1. Redux 将整个应用状态(state)存储到一个地方(通常我们称其为 store)
  2. 当我们需要修改状态时,必须派发(dispatch)一个 action( action 是一个带有 type 字段的对象)
  3. 专门的状态处理函数 reducer 接收旧的 state 和 action ,并会返回一个新的 state
  4. 通过 subscribe 设置订阅,每次派发动作时,通知所有的订阅者。

从这个流程中可以看出,Redux 的核心就是一个 观察者 模式。一旦 store 发生了变化就会通知所有的订阅者,视图(在这里是react组件)接收到通知之后会进行重新渲染。

Redux案例

为了简化说明,我用和官网差不多的例子改写来作案例官网redux demo

新建一个文件redux.js,然后直接引入,观察控制台输出

import { createStore } from 'redux'
const defaultState = {
    value: 10
}
// reducer处理函数
function reducer (state = defaultState, action) {
    console.log(state, action)
    switch (action.type) {
        case 'INCREMENT':
            return {
                ...state,
                value: state.value + 1
            }
        case 'DECREMENT':
            return {
                ...state,
                value: state.value - 1
            }
        default:
            return state
    }
}
const store = createStore(reducer)

const init = store.getState()
console.log(`一开始数字为:${init.value}`)

function listener () {
    const current = store.getState()
    console.log(`当前数字为:${current.value}`)
}
store.subscribe(listener) // 监听state的改变

store.dispatch({ type: 'INCREMENT' })
// 当前数字为:11
store.dispatch({ type: 'INCREMENT' })
// 当前数字为:12
store.dispatch({ type: 'DECREMENT' })
// 当前数字为:11

export default store

输出结果:

{value: 10} {type: "@@redux/INIT1.a.7.g.7.t"}
一开始数字为:10
{value: 10} {type: "INCREMENT"}
当前数字为:11
{value: 11} {type: "INCREMENT"}
当前数字为:12
{value: 12} {type: "DECREMENT"}
当前数字为:11

所有对数据的操作必须通过 dispatch 函数,它接受一个参数action,action是一个普通的JavaScript对象,action必须包含一个type字段,告诉它要修改什么,只有它允许才能修改。

在每次调用进来reducer函数我们都打印了state和action,我们手动通过store.dispatch方法派发了三次action,但你会发现输出了四次.这是因为Redux内部初始化就自动执行了一次dispatch方法,可以看到第一次执行它的type对我们数据来说是没有影响的(因为type取值@@redux/INIT1.a.7.g.7.t,我们自己redux的数据type不会取名成这个样子&

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是创建一个基本的 Redux 项目的步骤: 1. 首先,你需要在本地安装 Node.js 和 npm。 2. 打开终端并创建一个新的项目文件夹: ```bash mkdir my-redux-app cd my-redux-app ``` 3. 初始化 npm 项目并安装必要的依赖: ```bash npm init -y npm install redux react-redux redux-thunk ``` 4. 创建一个 `src` 文件夹和一个 `index.js` 文件: ```bash mkdir src touch src/index.js ``` 5. 在 `index.js` 文件中导入 Redux 库并创建一个 store: ```javascript import { createStore } from 'redux'; const initialState = {}; const reducer = (state = initialState, action) => { switch (action.type) { default: return state; } }; const store = createStore(reducer); ``` 6. 在 `index.js` 文件中渲染 React 应用并将 store 传递给应用: ```javascript import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import App from './App'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ); ``` 7. 创建一个 `App.js` 文件并编写 React 组件: ```javascript import React from 'react'; import { connect } from 'react-redux'; const App = ({ state }) => { return ( <div> <h1>Hello, Redux!</h1> <pre>{JSON.stringify(state, null, 2)}</pre> </div> ); }; const mapStateToProps = (state) => { return { state, }; }; export default connect(mapStateToProps)(App); ``` 8. 在 `index.html` 文件中创建一个根节点: ```html <!DOCTYPE html> <html> <head> <title>My Redux App</title> </head> <body> <div id="root"></div> <script src="./dist/bundle.js"></script> </body> </html> ``` 9. 使用 webpack 或者其他打包工具将项目打包成一个 `bundle.js` 文件。 10. 在终端中运行应用: ```bash npm start ``` 以上是创建一个基本的 Redux 项目的步骤,你可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值