redux入门

背景交代

举个例子。有个内容编辑的页面,如下图。它由不同的子组件(输入框组件A、图片上传组件B、富文本编辑组件C等)组成。不同的子组件负责页面中的不同的数据。点击【保存草稿】、【预览提交】按钮,将所有数据传送到后端。

原来对数据的处理是:A、B、C等子组件在每次value发生变化时,使用this.props.callback(xxx, xxx, xxx)的形式,将自己所包含的数据传出。

现改为使用redux维护数据:

/****** 我的习惯是先看怎么用,再看为什么这么用。所以接下来我们先看下怎么用。 ******/

怎么用

1.安装依赖

npm install --save redux
npm install --save react-redux

2.构建

最常用的3种项目结构:①按照类型;②按照功能;③Ducks。具体解释可参见React+Redux项目结构最佳实践

Ducks是一种新的Redux项目结构的提倡。它提倡将关联的reducer、action types和action写在同一个文件里。本文采用这种结构。

第一步src中新建文件夹redux,然后在redux文件中新建一个文件configureStore.js。此时的文件结构如下:

 第二步 在configureStore.js文件中添加下面的代码:

import { createStore, applyMiddleware, combineReducers } from 'redux';
import contentCreate from './modules/content_create';


const createStoreWithMiddleware = applyMiddleware()(createStore); 

const reducer = combineReducers({contentCreate});

const configureStore = (initialState) => createStoreWithMiddleware(reducer, initialState);
export default configureStore;

第三步 在redux文件夹中新建文件夹modules,然后在modules中新建一个文件,并以容器组件的名字来命名。此时的文件结构如下:

第四步 在新创建的文件(这里是content_create.js)中添加下面的代码:

const UPDATE_CREATE_DATA = Symbol('UPDATE_CREATE_DATA');

export function updateCreateData (index) {
  return {
    type: UPDATE_CREATE_DATA,
    index,
  };
}

const initialState = {
  draftData: {},  // 草稿数据
  finalData: {},  // 最终的数据
};

export default function reducer (state = initialState, action) {
  switch (action.type){
  case UPDATE_CREATE_DATA:
    return Object.assign(
      {},
      state,
      {
        draftData: {...state.draftData},
        finalData: {...state.finalData},
      }
    );
  default:
    return state;
  }
}

3.与app建立联系

第一种方案:改造原先的容器组件(这里假设为是content_create)。

第一步 新增下列import语句:

import { connect } from 'react-redux';
import {
  updateCreateData,
} from '../redux/modules/content_create';

 第二步 新增下列函数:

function mapStateToProps (state) {
  return {
    draftData: state.draftData,  // 草稿数据
    finalData: state.finalData,  // 最终的数据
  };
}

function mapDispatchToProps (dispatch) {
  return {
    updateCreateData: (value) => dispatch(updateCreateData(value)),
  };
}

 第三步 将原先的export default XXX语句改成如下:

export default connect (
  mapStateToProps,
  mapDispatchToProps
)(XXX);

最终应该是这样的:

// 原先的import语句
import { connect } from 'react-redux';
import {
  updateCreateData,
} from '../redux/modules/content_create';

function mapStateToProps (state) {
  return {
    draftData: state.draftData,  // 草稿数据
    finalData: state.finalData,  // 最终的数据
  };
}

function mapDispatchToProps (dispatch) {
  return {
    updateCreateData: (value) => dispatch(updateCreateData(value)),
  };
}

class XXX extends Component {
  // ...
}

export default connect (
  mapStateToProps,
  mapDispatchToProps
)(XXX);

第二种方案:原先的容器组件不变,新增 content_create_containers.js文件,并将项目中对原容器组件的引用改为对新增的这个 content_create_containers.js的引用。代码类似。

第一步 在src下新建文件夹containers,并在改文件夹下创建一个文件,以`${容器组件名}_containers`命名。

第二步 在新创建的文件(这里是content_create_containers.js)中添加下面代码:

import { connect } from 'react-redux';
import contentCreate from '../react/pages/content_create';
import {
  updateCreateData,
} from '../redux/modules/content_create.js';

function mapStateToProps (state) {
  return {
    draftData: state.draftData,  // 草稿数据
    finalData: state.finalData,  // 最终的数据
  };
}

function mapDispatchToProps (dispatch) {
  return {
    updateCreateData: (value) => dispatch(updateCreateData(value)),
  };
}

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(contentCreate);

第三步 将项目中对原容器组件的引用改为对新增的这个 content_create_containers.js的引用。如在router文件中有对content_create的引用,那么将import contentCreate from './XXX/content_create' 改成import contentCreate from './YYY/content_create_containers.js'。

4.改造app.js

第一步 新增下列import语句。

import { Provider } from 'react-redux';
import contentCreateContainer from './containers/content_create_container';
import configureStore from './redux/configureStore';

第二步 声明一个常量store,并把它传给Provider组件。

const store = configureStore();
    <Provider store={store}>
      {/* 原先的组件 */}
    </Provider>

为什么

到这里,已经可以用起来了。心里有点沾沾自喜。但是我们再花几分钟的时间看一下为什么要这么做吧。因为我们是好奇宝宝呀~(同事说用波浪号的都是女生~_~)

 

未完待续......

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Redux Toolkit和React Redux库来创建React应用程序中的Redux状态管理。官方推荐的方式是使用官方的Redux JS模板或Redux TS模板,它们基于Create React App并集成了Redux Toolkit和React Redux。 对于使用纯JavaScript的Redux模板,可以使用以下命令创建新的React应用程序: ``` npx create-react-app my-app --template redux ``` 对于使用TypeScript的Redux模板,可以使用以下命令创建新的React应用程序: ``` npx create-react-app my-app --template redux-typescript ``` 在Redux中,首先需要创建一个存储状态的store。整个项目只能有一个store,可以在index.js(或其他入口文件)中创建它。使用Redux的createStore函数来创建store,并将其作为属性传递给Provider组件,如下所示: ```javascript import React from 'react'; import ReactDOM from 'react-dom'; import './index.scss'; import ToDoList from './containers/ToDoList'; import { createStore } from 'redux'; import { Provider } from 'react-redux'; import reducer from './reducers/common'; const store = createStore(reducer); ReactDOM.render( <Provider store={store}> <ToDoList /> </Provider>, document.getElementById('root') ); ``` 这样,Reduxstore就被创建并与React应用程序连接起来了。你可以在ToDoList组件或其他组件中使用Redux的connect函数来连接store并访问其中的状态和操作。 希望这个回答对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [React-redux使用教程](https://blog.csdn.net/xm1037782843/article/details/127606426)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [React学习(三):Redux入门教程](https://blog.csdn.net/sinat_33523805/article/details/102718979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值