当前位置: 首页 > 后端技术 > Node.js

React的原理和工作流程

时间:2023-04-03 11:56:32 Node.js

react-redux提供了connect和provider两种很好的方式。提供者将组件与redux相关联,并将商店传递给组件。组件通过dispatch发送一个action,store根据action的type属性进行调用。对应的reducer传入state和action,reducer处理state返回一个新的state放入store,connect监听store的变化,调用setState更新组件,组件的props也connect、Provider、mapStateToProps、mapDispatchToProps,都是react-redux提供的,redux本身和react没有任何关系,只是一个数据处理中心,react-redux将它们连接起来。Redux由store、reducer和action组成。商店是一个对象。它主要有四个方法dispatch:用于action分发,dispatch修改在creactStore中。比如当action传入dispatch时,reducer会立即被触发。有时我们并不想立即触发,而是等待异步操作结束后再触发。这个时候我们可以传入的不仅仅是一个对象,而是一个函数。在函数中,我们dispatch了一个action对象来实现异步subscribe:monitorstatechanges,这个函数调用dispatch的时候,会注册一个listener来监听状态的变化。当我们需要知道状态是否发生变化时可以调用它。它返回一个函数。调用这个返回函数可以取消监听,让unsubscribe=store.subscribe(()=>{console.log("statehaschanged")})getState:两个地方需要用到:1.获取store中的statestore,使用action触发reducer改变state,将数据传递给reducer。这个过程是自动执行的2、使用subscribe监听状态变化,调用它获取新的状态数据replaceReducer:替换reducer,更改状态修改的逻辑store,通过createStore()方法创建,接受三个参数,以及通过combineReducers将reducer和state初始化结合起来State和middleware用于更改调度。最后两个参数不是必需的。store的主要功能是连接action和reducer并改变状态。actionaction是一个对象,其中需要有type属性,同时可以传入一些数据。action可以用actionCreator创建,dispatch是将action对象发送出reducerreducer是一个函数,它接受一个state和一个action,根据action的类型返回一个新的state,可以根据业务分成多个reducer逻辑,然后通过combineReducers将它们合并,state中有很多对象,每个state对象对应一个reducer,eg:constreducer=combineReducers({a:doSomethingWithA,b:processB,c:c})combineReducers:其实也是一个reducer,接受整个state和一个action,然后将整个state切分,发送给对应的reducer处理。所有reducer都会收到相同的action,但是会根据action的类型进行判断。如果有,则处理,然后返回到新的状态。如果不是,则返回默认值,然后将分散的状态整合在一起,返回一个新的状态。connectconnect(mapStateToProps,mapDispatchToProps,mergeProps,options)是一个函数,接受四个参数,返回一个函数,wrapWithConnect,wrapWithConnect接受一个组件作为参数,在里面定义一个新的组件,传入的组件作为Connect的子组件和然后返回完整的写法:connect(mapStateToProps,mapDispatchToProps,mergeProps,options)(component)mapStateToProps(state,[ownProps])1.mapStateToProps接受两个参数,storestate和customprops,2.并返回一个新对象,this对象将作为道具的一部分传递给ui组件。3、我们可以根据组件需要的数据,自定义返回一个对象。ownProps的变化也会触发mapStateProps函数mapStateToProps(state){return{todos:state.todos};}mapDispatchToProps(dispatch,[ownProps])1.如果mapDispatchToProps是对象,会绑定store传递作为props的一部分进入ui组件2.如果是函数,则接受两个参数,bindActionCreators会绑定action并dispatch并返回一个对象,这个对象会作为props的一部分连同ownProps一起传入ui组件,3.所以不管mapDispatchToProps是对象还是函数,最终都会返回一个对象。如果是函数,可以自定义这个对象的键值。4.mapDispatchToProps返回的对象属性其实就是actionCeators。因为已经绑定了dispatch,所以actionCreator调用时会立即发送action,不需要手动dispatch。5.ownProps的变化也会触发mapDispatchToPropsmergeProps(tateProps,dispatchProps,ownProps)将mapStateToProps()和mapDispatchToProps()返回的对象和组件本身的props组合成新的props传给组件。默认返回stateProps和dispatchProps结果之和。options:pure=true表示Connect容器组件会在shouldComponentUpdate中更新store的state和ownProps进行浅层比较,判断是否有变化,优化性能。如果为假,则不进行比较。完成React--Redux--React流程1.Provider组件接受reduxstore作为props,然后通过context向下传递2.connect函数会在初始化时将mapDispatchToProps对象绑定到store上。如果mapDispatchToProps是一个函数,那么Connect组件获取到store后,会根据传入的store.dispatch和action,通过bindActionCreators进行绑定,然后将返回的对象绑定到store上。connect函数会返回一个wrapWithConnect函数,同时wrapWithConnect会被调用并传入一个ui组件,wrapWithConnect内部定义了一个Connect组件,传入的ui组件是Connect的子组件,那么Connect组件会拿到store通过context,并通过store.getState获取完整的state对象,将state传入mapStateToProps并返回stateProps对象,然后Connect组件会通过context获取store,通过store.getState获取完整的state对象,并将状态传入mapStateToProps以返回stateProps对象,mapDispatchToProps对象或mapDispatchToProps函数将返回一个dispatchProps对象、stateProps、dispatchProps和Connect组件的props。当ui组件能在props中找到actionCreator,我们调用actionCreator时,会自动调用dispatch,dispatch中会调用getState获取整个state,注册一个listener监听state的变化,store会通过得到state和action给combineReducers,combineReducers会根据state的key值把state传递给子reducer,把action传递给所有的子reducer。reducers会依次执行,判断action.type。如果有新的状态,它会返回一个新的状态。如果没有,它将返回默认值。combineReducers再次将子reducer返回的各个状态组合成一个新的完整状态。此时状态已经改变。Dispatch会在state返回一个新值后调用所有注册的监听函数,包括handleChange函数。在handleChange函数内部,首先调用getState获取新的状态值,并对新旧状态进行浅比较。如果相同则直接返回。如果不同,调用mapStateToProps获取stateProps,浅对比新旧stateProps。如果相同,则直接返回结束,不做任何操作。如果没有,调用this.setState()触发Connect组件的更新,传入ui组件,触发ui组件的更新。此时ui组件获取到新的props,react-->redux-->react的流程结束。