React, Redux Application - 传递初始状态的最佳模式

Posted

技术标签:

【中文标题】React, Redux Application - 传递初始状态的最佳模式【英文标题】:React, Redux Application - Best pattern for passing initial state 【发布时间】:2018-06-03 12:44:48 【问题描述】:

我正在尝试使用 React 和 Redux 构建一个可重用的 Grid 组件。每个子组件(过滤器、分页器、排序器等)都需要初始配置或初始状态。目前我正在将减速器中的配置设置为初始状态。下面是列定义 reducer 的示例

import  Map, OrderedMap  from 'immutable'

let initialState = OrderedMap(
    'name': Map( id: 'name', description: 'Name'),
    'job': Map( id: 'job', description: 'Job Title'),
    'salary': Map( id: 'salary', description: 'Salary'),
    'phone': Map( id: 'phone', description: 'Phone'),
    'state':  Map( id: 'state', description: 'State'),
    'hiredate' : Map(id: 'hiredate', description: 'Date Hired')
);

let columnDefinitionsReducer = (namespace) => (state = initialState, action) => 
    switch (action.type) 
        default:
            return state;
    
;

export default columnDefinitionsReducer;

Grid 组件连接到 store 并根据 store 中的状态构建列。

为了使网格可重用,以便不同的组件可以传入不同的列定义,最好遵循什么模式。我需要在哪里保留此配置?

【问题讨论】:

我喜欢导出initialState 的对象,我可以在其中看到整个状态形状。我在减速器文件中写入的唯一初始状态是属于减速器的状态,我没有直接在我的组件中使用,它们只是减速器组合的一部分。 【参考方案1】:

我通过为网格创建配置对象并将其作为参数传递给减速器来解决它。我不确定这是否是最好的方法,但它符合我的目的

这是结构

配置对象

let employeeConfig = 
    namespace: 'employees',
    columndefs: OrderedMap(
        'name': Map( id: 'name', description: 'Name'),
        'job': Map( id: 'job', description: 'Job Title'),
        'salary': Map( id: 'salary', description: 'Salary'),
        'phone': Map( id: 'phone', description: 'Phone'),
        'state':  Map( id: 'state', description: 'State'),
        'hiredate' : Map(id: 'hiredate', description: 'Date Hired')
    ),
    filters: OrderedMap(
        'name': Map( id: 'name', hint: 'Search by name', value: '', maxValue: '', type: 'text' ),
        'job': Map( id: 'job', hint: 'Search by job title', value: '', maxValue: '', type: 'text' ),
        'state':  Map( id: 'state', hint: 'Search by state', value: '', maxValue: '', type: 'text' ),
        'salary':  Map( id: 'salary', hint: 'Salary', value: '', maxValue: '', type: 'range' ),
        'hiredate':  Map( id: 'hiredate', hint: 'Hired Date', value: '', maxValue: '', type: 'date-range' )
    ),
    perPage: 10,
    defaultSort: 'id'

export default employeeConfig;

Root Reducer

 import employeeConfig from '../components/employees/employee_config'

const employeesReducer = combineReducers(
    currentPage : currentPageReducer(employeeConfig.namespace, 1),
    itemProperties : itemPropertiesReducer(employeeConfig.namespace, employeeConfig.columndefs),       
    itemsPerPage : perPageReducer(employeeConfig.namespace, employeeConfig.perPage),
    sortingProperty : sortReducer(employeeConfig.namespace, employeeConfig.defaultSort),
    filters : filtersReducer(employeeConfig.namespace, employeeConfig.filters)
);

减速器

 let itemsPerPage = (namespace, config) => (state = config, action) => 
    switch (action.type) 
        case `$namespace/$UPDATE_PER_PAGE`:
            return action.payload
        default:
            return state;
    
;

export default itemsPerPage;

【讨论】:

以上是关于React, Redux Application - 传递初始状态的最佳模式的主要内容,如果未能解决你的问题,请参考以下文章

登录后react-redux重定向到其他页面

如何在 React Redux 应用程序中使用装饰器?

是否可以在 React-Redux 应用程序中使用 Immutable.js 来比较 shouldComponentUpdate 中的道具?

React+Redux学习笔记:React+Redux简易开发步骤

Redux 进阶之 react-redux 和 redux-thunk 的应用

React之React-redux数据流转流程