react状态管理

状态管理

flux(思想) vue实现(vuex) react实现(react-redux)

状态管理(redux): 可以同一个地方查询状态,改变状态,传播状态
何时用:中大项目,组件状态需要共享,在任何地方都可以拿到,组件需要改变全 局状态,一个组件需要改变另外一个组件的状态

思维: 在顶层组件创建store(状态),其他底层组件共享这个store(状态)

数据流动:

component->action->reducer->state->component

component: 展示结果(含处理结果代码)
action: 动作转发,异步请求,
reducer: 业务处理逻辑,copy+更新 + 返回(return)新state
state: 状态收集,更新内部state状态,更新订阅(store.subscribe)state的组件(component)

通过store.dispatch发送action 给 reducer
在组件内部 通过 store.getState() 抓state状态  特点 只抓一次
		   store.subscribe() 订阅  数据更新,会触发
		   getState放在subscribe内部

操作流程:

  1. 引入
{createStore} from 'redux'
  1. 生成默认state
defaultState={}
  1. 创建reducer
const reducer = (state=defaultState,action)=>{
	let {type,payload}=action
	swtich type
		case XXXXX
		更新copy后的state  Object.assign(,,)
	default:
		return state
}
  1. 创建store对象
store = createStore(reducer,state)
  1. store传递给组件
<组件名 store={store}/>
  1. 更新,状态获取
组件内部:	this.props.store== store
this.props.store.dispatch({type:xxx,payload:ooo}) 发送action给reducer
this.props.store.subscribe(回调)  订阅 state  更新state时触发
this.props.store.getState() 获取状态,执行一次

react-redux

基于redux思想,专门为react而生

思想: 容器组件, UI组件

App: 拿到store,修改、获取store
store:外面
index.js:
	import {Provider} from react-redux

	<Provider store={store}>
		<容器组件/>
	</Provider>

	<Provider store={store}>
		<BrowserRouter>
			<容器组件/>
	</Provider>

	export default withRouter(connect(
	  mapStateToProps,
	  mapdispatchToProps
	)(App));

redux-thunk

异步action + 可复用: dispatch(asyncAction(xx,xx,xx)) dispatch 默认接受对象 asyncAtion内部要返回对象
异步action + 可复用: dispatch(asyncAction(xx,xx,xx)) dispatch 接受函数 asyncAtion内部要返回函数
需要中间件redux-thunk支持 ,dispatch默认支持对象,不接受函数,中间件用来改装dispatch

	let store = createStore(
	  reducer,
	  state,
	  applyMiddleware(thunk)  applyMiddleware是redux API
	);
asyncAction = (url,type,id) => (dispatch,getState)=>{dispatch1次 + return fetch+then+dispath2次+return data}
	外部dispatch调用返回的函数后,返回promise,因此在组件内部可以做一些结果处理业务
		action内部需要return fetch
		fetch内部需要return data 有定时器会出错

片段(fragments) :

为一个组件返回多个元素。 可以让你将子元素列表添加到一个分组中,并且不会在DOM中增加额外节点
<React.Fragment key="bmw"></..>
  1. 项目分析,组件安排
|-pubilc
|- data
	|- 数据
|-index.html
|-node_modules
|-src
|-library
	|-jquery.js
	|-swiper.js
|-common
	|- Header/Footer/Slider / Error / List
|- components
	|- App
		App.js/App.css|image
	|- Home / Follow / Column / User
	|- Detail / Login / Reg
|- api
	|- date.js / fillzero.js/...
|- assets
	|- img
|- store
	|- state/reducer/asyncAction
Index.js
	index.css 公共样式

  1. 布局(切图,mint-ui,elementUI…ant.design),模板移植
    样式:全局引入
    src / import
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值