chst365's blog chst365's blog
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

chst365

DIV工程师
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • NodeJS系列

  • Linux系列

  • JavaScript系列

  • HTTP系列

  • GIT系列

  • ES6系列

  • 设计模式系列

  • CSS系列

  • 小程序系列

  • 数据结构与算法系列

  • React系列

    • React中组件之间如何通信?
    • 说说React diff的原理是什么?
    • 说说你在React项目是如何捕获错误的?
    • 说说对受控组件和非受控组件的理解?应用场景?
    • 在react中组件间过渡动画如何实现?
    • 说说React服务端渲染怎么做?原理是什么?
    • 说说你在使用React 过程中遇到的常见问题?如何解决?
    • 说说对Fiber架构的理解?解决了什么问题?
    • 说说对React Hooks的理解?解决了什么问题?
    • React事件绑定的方式有哪些?区别?
    • 你在React项目中是如何使用Redux的? 项目结构是如何划分的?
      • 一、背景
      • 二、如何做
        • Provider
        • connection
        • mapStateToProps
        • mapDispatchToProps
        • 小结
      • 三、项目结构
      • 参考文献
    • React构建组件的方式有哪些?区别?
    • 说说对Redux中间件的理解?常用的中间件有哪些?实现原理?
    • state 和 props 有什么区别?
    • 说说 React中的setState执行机制
    • 说说React render方法的原理?在什么时候会被触发?
    • 说说你对Redux的理解?其工作原理?
    • 说说你对immutable的理解?如何应用在react项目中?
    • 说说 Real DOM 和 Virtual DOM 的区别?优缺点?
    • super() 和 super(props) 有什么区别?
    • 说说你是如何提高组件的渲染效率的?在React中如何避免不必要的render?
    • 说说对 React 的理解?有哪些特性?
    • 说说 React 性能优化的手段有哪些?
    • 说说对React refs 的理解?应用场景?
    • 说说你对React Router的理解?常用的Router组件有哪些?
    • 说说对高阶组件的理解?应用场景?
    • 说说 React 生命周期有哪些不同阶段?每个阶段对应的方法是?
    • 说说react中引入css的方式有哪几种?区别?
    • 说说React的事件机制?
    • 说说React Jsx转换成真实DOM过程?
    • React中的key有什么作用?
    • 说说React Router有几种模式?实现原理?
    • 说说对React中类组件和函数组件的理解?有什么区别?
  • Vue3系列

  • Vue系列

  • TypeScript系列

  • Webpack系列

  • 面试官
  • React系列
chst365
2023-06-28
目录

你在React项目中是如何使用Redux的? 项目结构是如何划分的?

# 面试官:你在React项目中是如何使用Redux的? 项目结构是如何划分的?

# 一、背景

在前面文章了解中,我们了解到redux是用于数据状态管理,而react是一个视图层面的库

如果将两者连接在一起,可以使用官方推荐react-redux库,其具有高效且灵活的特性

react-redux将组件分成:

  • 容器组件:存在逻辑处理
  • UI 组件:只负责现显示和交互,内部不处理逻辑,状态由外部控制

通过redux将整个应用状态存储到store中,组件可以派发dispatch行为action给store

其他组件通过订阅store中的状态state来更新自身的视图

# 二、如何做

使用react-redux分成了两大核心:

  • Provider
  • connection

# Provider

在redux中存在一个store用于存储state,如果将这个store存放在顶层元素中,其他组件都被包裹在顶层元素之上

那么所有的组件都能够受到redux的控制,都能够获取到redux中的数据

使用方式如下:

<Provider store = {store}>
    <App />
<Provider>
1
2
3

# connection

connect方法将store上的getState和 dispatch包装成组件的props

导入conect如下:

import { connect } from "react-redux";
1

用法如下:

connect(mapStateToProps, mapDispatchToProps)(MyComponent)
1

可以传递两个参数:

  • mapStateToProps

  • mapDispatchToProps

# mapStateToProps

把redux中的数据映射到react中的props中去

如下:

const mapStateToProps = (state) => {
    return {
        // prop : state.xxx  | 意思是将state中的某个数据映射到props中
        foo: state.bar
    }
}
1
2
3
4
5
6

组件内部就能够通过props获取到store中的数据

class Foo extends Component {
    constructor(props){
        super(props);
    }
    render(){
        return(
         // 这样子渲染的其实就是state.bar的数据了
            <div>this.props.foo</div>
        )
    }
}
Foo = connect()(Foo)
export default Foo
1
2
3
4
5
6
7
8
9
10
11
12
13

# mapDispatchToProps

将redux中的dispatch映射到组件内部的props中

const mapDispatchToProps = (dispatch) => { // 默认传递参数就是dispatch
  return {
    onClick: () => {
      dispatch({
        type: 'increatment'
      });
    }
  };
}

1
2
3
4
5
6
7
8
9
10
class Foo extends Component {
    constructor(props){
        super(props);
    }
    render(){
        return(
         
             <button onClick = {this.props.onClick}>点击increase</button>
        )
    }
}
Foo = connect()(Foo);
export default Foo;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 小结

整体流程图大致如下所示:

# 三、项目结构

可以根据项目具体情况进行选择,以下列出两种常见的组织结构

# 按角色组织(MVC)

角色如下:

  • reducers
  • actions
  • components
  • containers

参考如下:

reducers/
  todoReducer.js
  filterReducer.js
actions/
  todoAction.js
  filterActions.js
components/
  todoList.js
  todoItem.js
  filter.js
containers/
  todoListContainer.js
  todoItemContainer.js
  filterContainer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 按功能组织

使用redux使用功能组织项目,也就是把完成同一应用功能的代码放在一个目录下,一个应用功能包含多个角色的代码

Redux中,不同的角色就是reducer、actions和视图,而应用功能对应的就是用户界面的交互模块

参考如下:

todoList/
  actions.js
  actionTypes.js
  index.js
  reducer.js
  views/
    components.js
    containers.js
filter/
  actions.js
  actionTypes.js
  index.js
  reducer.js
  views/
    components.js
    container.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

每个功能模块对应一个目录,每个目录下包含同样的角色文件:

  • actionTypes.js 定义action类型
  • actions.js 定义action构造函数
  • reducer.js 定义这个功能模块如果响应actions.js定义的动作
  • views 包含功能模块中所有的React组件,包括展示组件和容器组件
  • index.js 把所有的角色导入,统一导出

其中index模块用于导出对外的接口

import * as actions from './actions.js';
import reducer from './reducer.js';
import view from './views/container.js';

export { actions, reducer, view };
1
2
3
4
5

导入方法如下:

import { actions, reducer, view as TodoList } from './xxxx'
1

# 参考文献

  • https://www.redux.org.cn/docs/basics/UsageWithReact.html
  • https://segmentfault.com/a/1190000010384268
#面试官
上次更新: 2025/04/11, 17:57:53
React事件绑定的方式有哪些?区别?
React构建组件的方式有哪些?区别?

← React事件绑定的方式有哪些?区别? React构建组件的方式有哪些?区别?→

最近更新
01
面试官
03-27
02
this&指针&作用域&闭包
03-27
03
前端
03-27
更多文章>
Theme by Vdoing | Copyright © 2019-2025 chst365 | 豫ICP备17031889号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式