1. immutable.js
Immutable是一种数据结构设计概念,指的是数据一旦创建,便不可被修改。任何对immutable对象的修改都会生成一个新的immutable对象,原始的immutable对象不会被修改。这个概念最初被提出是为了提高数据结构的可靠性和可复用性,它在函数式编程中得到广泛应用。
在JavaScript中,由于原始数据结构是可变的,这会导致数据共享和数据引用的问题。对于复杂的数据结构,这种问题会带来很多的风险和不确定性。为了解决这个问题,Facebook团队开发了Immutable.js这个库,通过提供immutable的数据结构和相关操作方法,让开发者可以方便地使用immutable数据结构来替代原生的可变数据结构,从而提高应用程序的性能、可靠性和可维护性。
在React和Redux中,使用immutable对象来管理应用程序的状态是非常常见的做法。Redux官方推荐的也是使用immutable对象来管理state。由于immutable对象是不可变的,这意味着在Redux应用程序中进行状态更改的操作都是纯函数,不会引起任何的副作用,这样能够提高代码的可读性和可维护性。
安装 immutable.js:
npm install immutable
安装完成后,可以直接使用:
javascriptCopy code
import * as constants from './constants'
import {fromJS} from 'immutable';
const defaultState = fromJS({
focused: false
});
在需要使用 state 的地方,需要通过 get 方法来获取属性。直接修改会报错,这是因为 reducer 处理完毕之后也要返回一个 immutable 对象,否则就没有 get 方法可用。
在 immutable.js 中,set 方法的逻辑会结合之前 immutable 对象的值和设置值,返回一个全新的对象,这样就可以避免修改对象数据的情况。
想要更深入地了解 immutable.js,可以查看官方文档。
2. 使用 redux-immutable 模块
在 redux 中,调用 state 对象的方式并不统一。例如,使用 state.header.getxxx 来获取 header 的属性,但全局的 state 并不是 immutable 对象,只有 state.header 才是 immutable 对象。这会导致代码难以维护。
为了解决这个问题,我们可以使用第三方模块 redux-immutable:
javascriptCopy code
import {combineReducers} from 'redux-immutable';
import {reducer as headReducer} from '../common/header/store';
export default combineReducers({
header: headReducer
});
安装完成后,只需要把 combineReducers 方法的引用位置换成这个库即可。这样就可以统一调用 state 对象了。