react-redux搭建及不同版本间的对比

一.经典版

1. 安装Redux和React Redux

 npm install redux react-redux

2. 创建action

// actions/counterActions.js
export const increment = () => {
  return {
    type: 'INCREMENT'
  };
};

export const decrement = () => {
  return {
    type: 'DECREMENT'
  };
};

export const add = (amount) => ({
  type: 'ADD',
  payload: amount,
});

3. 创建reduce

// reducers/counterReducer.js
const counterReducer = (state = 0, action: any) => {
    switch (action.type) {
        case 'INCREMENT':
            return state + 1;
        case 'DECREMENT':
            return state - 1;
        case "ADD":
            return state + 5;
        default:
            return state;
    }
};

export default counterReducer;

4. 在项目的src目录中创建store.js

// store.js
import { legacy_createStore as createStore, combineReducers, applyMiddleware, compose } from 'redux';

// 引入 reducer
import counterReducer from './reducer';

// 使用 combineReducers 组合多个 reducer
const rootReducer = combineReducers({
  counter: counterReducer,
  // 这里可以添加更多的 reducer
});

// 为 Redux DevTools 扩展设置
const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

// 创建 Redux store,添加中间件支持,同时启用 Redux DevTools
const store = createStore(
  rootReducer,
  /* preloadedState, */
  composeEnhancers(applyMiddleware(
    // 这里是将来可能添加的中间件
  ))
);

export default store;

5. 在React组件中使用

a. 首先,在应用的最顶层组件(App.js)中使用<Provider>组件包裹你的应用,将store传递给它

// src/App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import MyComponent from './MyComponent';

function App() {
  return (
    <Provider store={store}>
      <div className="App">
        <MyComponent />
      </div>
    </Provider>
  );
}

export default App;

b. 然后,在需要访问Redux store的组件中使用useSelector来读取状态,使用useDispatch来分发action

// Counter.jsx
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement,add } from '../store/action';

const Counter = () => {
  const count = useSelector((state:any) => state.counter);
  const dispatch = useDispatch();

  return (
    <div>
      <h2>Counter: {count}</h2>
      <button onClick={() => dispatch(increment())}>Increment</button>
      <button onClick={() => dispatch(decrement())}>Decrement</button>
      <button onClick={() => dispatch(add(5))}>Add 5</button>
    </div>
  );
};

export default Counter;

二、旧版

这种方法在react-redux版本5及之前非常流行,随着react-redux版本6和7的发布,这种方法已经被淘汰了。但是企业中仍有很多旧项目保持着这种写法,所以学会这项技术的使用也是必须的。

1.安装

npm install redux react-redux

2Action

// src/actions/index.js
export const increment = () => {
  return {
    type: 'INCREMENT',
  };
};

export const decrement = () => {
  return {
    type: 'DECREMENT',
  };
};

3.创建Reducer

// src/reducers/counterReducer.js
const counterReducer = (state = { count: 0 }, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
};

export default counterReducer;

4.创建Store

// src/store.js
import { createStore, combineReducers } from 'redux';
import counterReducer from './reducers/counterReducer';

const rootReducer = combineReducers({
  counter: counterReducer,
});

const store = createStore(rootReducer);

export default store;

5.组件中使用

a. 使用 Provider from react-redux 把 Redux store 提供给 React 应用

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

b. 然后,在需要访问Redux store的组件中使用

// src/App.js
import React from 'react';
import { connect } from 'react-redux';
import { increment, decrement } from './actions';

// 定义并导出函数式组件
const App = (props) => {
  return (
    <div>
      <h2>Counter: {props.count}</h2>
      <button onClick={props.increment}>+</button>
      <button onClick={props.decrement}>-</button>
    </div>
  );
};

// mapStateToProps remains unchanged
const mapStateToProps = (state) => {
  return {
    count: state.counter.count,
  };
};

// mapDispatchToProps remains unchanged as well
const mapDispatchToProps = { 
  increment,
  decrement,
};

// 在组件中使用 connect() 去连接 Redux store
export default connect(mapStateToProps, mapDispatchToProps)(App);

三、最新版

@reduxjs/toolkit 是 Redux 团队推荐的方式来编写 Redux 逻辑的工具集。它旨在提供更简便的 API,帮助开发者解决 Redux 应用中经常遇到的一些常见问题,如配置 store、添加中间件、编写 reducer 逻辑等。Redux Toolkit 引入了几个核心概念,如“切片(slices)”来简化 reducer 和 action creators 的编写,以及创建异步逻辑的“createAsyncThunk”等工具。

1.安装

npm install @reduxjs/toolkit react-redux

2.使用 createSlice 创建一个包含了 reducer 函数和 actions 的切片(slice)

// slices/counterSlice.js
import { createSlice } from '@reduxjs/toolkit';

export const counterSlice = createSlice({
    name: 'counter',
    initialState: { value: 0 },
    reducers: {
        increment: state => {
            state.value += 1;
        },
        decrement: state => {
            state.value -= 1;
        },
        add: (state,pa) => {
            state.value += pa.payload;
        },
    },
});

export const { increment, decrement,add } = counterSlice.actions;

export default counterSlice.reducer;

3.通过 Redux Toolkit 的 configureStore 来创建和配置 store

// store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './slices/counterSlice';

export const store = configureStore({
  reducer: {
    counter: counterReducer,
  },
});

4.组件中使用

a. 首先,在应用的最顶层组件(App.js)中使用<Provider>组件包裹你的应用,将store传递给它

// index.js 或 App.js,根据你的项目结构来决定
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import App from './App'; // 这是你的应用组件
import { store } from './store'; // 确保从 store.js 正确导入 store

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

b. 然后,在需要访问Redux store的组件中使用useSelector来读取状态,使用useDispatch来分发action

// Counter.jsx
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement, add } from '../store/reducer';

const Counter = () => {
    const count = useSelector((state: any) => state.counter.value);
    const dispatch = useDispatch();

    return (
        <div>
            <h2>Counter: {count}</h2>
            <button onClick={() => dispatch(increment())}>Increment</button>
            <button onClick={() => dispatch(decrement())}>Decrement</button>
            <button onClick={() => dispatch(add(9))}>Decrement</button>
        </div>
    );
};

export default Counter;

插入:小编自己封装了一个大文件上传的工具函数,支持切片上传、错误重试、上传进度、暂停和继续等,目前已发布在npm官网,感兴趣的可以看看。

https://www.npmjs.com/package/enlarge-file-upload?activeTab=versions

下载命令:npm i enlarge-file-upload

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值