一、React项目中状态管理方式
- Redux
需要用户手动订阅状态变化
- Redux+React-Redux结合
不需要手动订阅
- redux + @rematch/core
语法更加接近vuex
二、ActionCreator模块
- action
描述用户行为的对象
- ActionCreator
用以创建用户行为描述的方法函数
export const increment = (payload)=>{
return {
type:IN_CREMENT,
payload
}
}
三、redux与react-redux结合实现状态管理
- 安装react-redux
cnpm i react-redux -S
- 在根组件App外,全局注入store
import store from './store'
import {Provider} from 'react-redux'
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
- 在需要获取store数据的组件中,使用connect进行提取
connect作用是,将store中的数据转移到当前组件的props中
import {connect} from 'react-redux' // 1.专门取数据的角色
class Num extends Component { //2. 需要使用数据的角色
render() {
console.log('Num组件',this.props);
}
}
const mapStateToProps=(state)=>{ //3. 给connect使用的特定方法函数
//自定义的方法函数,用以将状态机中的state设置到当前组件的props中
return {
num:state //num是自定义的props属性名,state就是状态机中的数据包
}
}
export default connect(mapStateToProps)(Num) //4. 调用connect,让他把数据转移到props中
- 在需要修改store数据的组件中,通过connect将对应的actionCreator转换为dispatch并使用
前提是,需要事先提取actionCreator模块
import {increment,decrement} from '../action' //引入actionCreator方法函数
import {connect} from 'react-redux'
class Btn extends Component {
render() {
console.log('Btn组件',this.props);
let {children,increment,decrement} = this.props
//这里的 increment,decrement 已经变成了对应的dispatch
}
}
export default connect(null,{increment,decrement})(Btn)