1. 什么是Redux?
Redux是一个JavaScript状态容器,它可以轻松管理React应用程序的状态。它提供了一种可预测的状态管理方式,可以使得应用程序的状态变化更加有序,方便调试并且易于维护。
Redux的核心概念是store、actions和reducers。
1.1 Store
一个Redux应用程序有一个store,它包含了整个应用程序的状态。通常来说,你不会直接修改store中的状态,而是通过dispatch一个action来触发一个reducer来修改状态。
store的创建代码如下:
import { createStore } from 'redux';
import rootReducer from '../reducers';
export default function configureStore(initialState) {
return createStore(
rootReducer,
initialState
);
}
1.2 Actions
Actions是一个纯javascript对象,它描述了一个状态变化的事件。一个Redux应用程序中的任何操作都必须通过dispatch一个action来完成。
一个action的代码可能如下:
const ADD_TODO = 'ADD_TODO'
{
type: ADD_TODO,
text: 'Build my first Redux app'
}
1.3 Reducers
Reducers是一种纯函数,在一个Redux应用程序中,Reducers负责管理修改store中的状态。Reducers接受一个先前的状态和一个action来计算出新的状态。
一个Reducer的代码示例如下:
const initialState = {
count: 0
}
function countReducer(state = initialState, action) {
switch(action.type) {
case 'INCREMENT':
return {...state, count: state.count + 1}
case 'DECREMENT':
return {...state, count: state.count - 1}
default:
return state
}
}
2. 微信小程序中使用Redux
Redux在React应用程序中得到了广泛应用,但是在小程序中也可以使用Redux。下面我们通过一个例子来帮助读者了解Redux在小程序中的使用方式。
2.1 安装Redux
首先需要安装Redux相关的依赖。
npm install redux redux-thunk redux-logger --save
2.2 创建Reducers
在Redux应用程序中,每个Reducer都管理一个或多个状态。我们为了简单,只管理一个状态。在此之前,需要安装ImmutableJS以保证状态的不可变性。
import Immutable from 'immutable'
const initialState = Immutable.fromJS({
count: 0,
})
export default function reducer(state = initialState, action) {
switch(action.type) {
case 'increment': {
const count = state.get('count') + 1
return state.set('count', count)
}
case 'decrement': {
const count = state.get('count') - 1
return state.set('count', count)
}
default:
return state
}
}
2.3 创建store
在小程序中,我们需要将Redux的store绑定到页面上,方便我们在页面中调用。在此之前,需要安装`@tarojs/redux`和`@tarojs/redux-h5`。
store的创建代码如下:
import { createStore, applyMiddleware } from 'redux'
import { createLogger } from 'redux-logger'
import thunk from 'redux-thunk'
import rootReducer from './reducers/'
const middlewares = [thunk]
if (process.env.NODE_ENV === 'development') {
const logger = createLogger()
middlewares.push(logger)
}
const store = createStore(
rootReducer,
applyMiddleware(...middlewares)
)
export default store
2.4 连接页面和Redux
我们使用connect函数将页面和Redux连接起来,这样当Redux的store变化时,页面会感知到。
代码示例如下:
import { connect } from 'react-redux'
import { increment, decrement } from './actions/Counter'
import { View, Text } from '@tarojs/components'
function Counter(props) {
const { counter } = props
const { count } = counter.toJS()
return (
<View>
<Text>{count}</Text>
<Button onClick={props.onDecrement}>-</Button>
<Button onClick={props.onIncrement}>+</Button>
</View>
)
}
export default connect(
state => ({ counter: state.counter })
dispatch => ({
onIncrement() {
dispatch(increment())
},
onDecrement() {
dispatch(decrement())
}
})
)(Counter)
2.5 创建actions
代码示例如下:
export const increment = () => ({
type: 'increment'
})
export const decrement = () => ({
type: 'decrement'
})
3. 结语
Redux可以帮助我们更好地管理应用程序中的状态,使得我们的应用程序更加健壮和具备良好的可维护性。在微信小程序中使用Redux可以使得我们更加方便地管理小程序的状态。