reactグローバルステータス管理最適化
20771 ワード
reduxとreact-reduxを組み合わせてインストール
indexでjsでProviderを導入し、storeがreact-reduxで提供するproviderプロバイダを介してルート要素のコンテキストにグローバルステータスオブジェクトをマウントします.
actionType.jsはステータス値を格納し、他の場所で変数で参照してプロジェクトの複雑なステータス値が多い場合に混乱を避けることができます.
reducer.jsグローバルステータス値が複雑な場合にjsファイルを新規作成して保存できます
actionCreator.jsはactionを送信せず,単純にactionを作成するために用いられる.
コンポーネントではグローバルステータス値を使用し、react-reduxで提供されるconnectによってコンポーネントとのコンテキストからstoreオブジェクトを取得し、高次コンポーネントによって取得したstoreをターゲットコンポーネントのpropsに渡す
connectの本質は1つの方法が1つの高次のコンポーネントのパラメータ1 mapStateToPropsを返して全体の状態の値をpropsの中のパラメータ2 mapDispatchToPropsのマッピングの方法をマッピングしてpropsの中に着いて、デフォルトのマッピングdispatchを書かないで、returnはどんなmapStateToPropsの本質をマッピングするのも1つの関数ですこの関数は、パラメータ としてグローバル状態値を受信する.この関数が返すデータはコンポーネントのpropsにマッピングされます
mapDisPatchToPropsの本質も関数ですは、パラメータ としてdispatchを接続することができる. returnのオブジェクトもpropsにマップされますmapDispatchToProps空であればdispathをpropsにマップします空でなければreturnのオブジェクトをpropsにマップします
投げ出すときは
redux+react-reduxの非同期問題は単独で使用する場合、非同期操作はActionCreatorに統一的に配置できるが、使用後、ActionCreatorのメソッド戻り値はオブジェクト解決方法applyMiddleWare+redux-thunkが非同期を解決するミドルウェアである必要がある
store.js
ActionCreator.jsに非同期を格納
余談、setStateの特性
setStateは非同期ですがsetStateが非同期に置かれると同期になります
npm install redux
npm install react-redux
indexでjsでProviderを導入し、storeがreact-reduxで提供するproviderプロバイダを介してルート要素のコンテキストにグローバルステータスオブジェクトをマウントします.
import {
Provider} from 'react-redux'
import store from './ReactRedux/store/store'
ReactDOM.render(<Provider store={
store}><App /></Provider>,
document.getElementById('root'));
actionType.jsはステータス値を格納し、他の場所で変数で参照してプロジェクトの複雑なステータス値が多い場合に混乱を避けることができます.
export const CHANGE_NAME = 'CHANGE_NAME'
export const CHANGE_AGE = 'CHANGE_AGE'
reducer.jsグローバルステータス値が複雑な場合にjsファイルを新規作成して保存できます
import {
CHANGE_NAME,CHANGE_AGE} from './actionType'
let state={
name:' ',
age:16
}
export default (prevState=state,actions)=>{
let newData = JSON.parse(JSON.stringify(prevState))
/*
1. ,
2. ,
*/
let {
type,payload} = actions
switch (type) {
case CHANGE_NAME:
newData.name = payload
break;
case CHANGE_AGE:
newData.age = payload
break;
default:
break;
}
return newData
}
actionCreator.jsはactionを送信せず,単純にactionを作成するために用いられる.
[CHANGE_NAME](){
let action = {
type:CHANGE_NAME,
payload:' '
}
return action
},
[CHANGE_AGE](){
let action = {
type:CHANGE_AGE,
payload:500
}
return action
}
コンポーネントではグローバルステータス値を使用し、react-reduxで提供されるconnectによってコンポーネントとのコンテキストからstoreオブジェクトを取得し、高次コンポーネントによって取得したstoreをターゲットコンポーネントのpropsに渡す
import React,{
Component} from 'react'
import {
connect} from 'react-redux'
import ActionCreator from './store/actionCreator'
import {
bindActionCreators} from 'redux'
class Son2 extends Component{
render(){
let {
name,age,CHANGE_AGE} = this.props
return(
<div>
<h3>son2</h3>
{
name}{
age}
<button onClick={
CHANGE_AGE}>changeage</button>
</div>
)
}
}
export default connect(state=>state,
dispatch=>bindActionCreators(ActionCreator,dispatch))(Son2)
connectの本質は1つの方法が1つの高次のコンポーネントのパラメータ1 mapStateToPropsを返して全体の状態の値をpropsの中のパラメータ2 mapDispatchToPropsのマッピングの方法をマッピングしてpropsの中に着いて、デフォルトのマッピングdispatchを書かないで、returnはどんなmapStateToPropsの本質をマッピングするのも1つの関数です
let mapStateToProps = (state)=>{
console.log(state)
console.log('mapStateToProps')
return state
}
mapDisPatchToPropsの本質も関数です
let mapDispatchToProps = (dispatch) =>{
// ActionCreator props
// dispatch
return bindActionCreators(ActionCreator,dispatch)
}
投げ出すときは
export default connect(state=>state,
dispatch=>bindActionCreators(ActionCreator,dispatch))( )
redux+react-reduxの非同期問題は単独で使用する場合、非同期操作はActionCreatorに統一的に配置できるが、使用後、ActionCreatorのメソッド戻り値はオブジェクト解決方法applyMiddleWare+redux-thunkが非同期を解決するミドルウェアである必要がある
store.js
import {
createStore,applyMiddleware} from 'redux'
import thunk from 'redux-thunk' //
import reducer from './reducer'
export default createStore(reducer,applyMiddleware(thunk))
ActionCreator.jsに非同期を格納
[CHANGE_NAME](){
return (dispatch)=>{
setTimeout(()=>{
let action = {
type:CHANGE_NAME,
payload:' '
}
dispatch(action)
},1000)
}
}
余談、setStateの特性
constructor(){
super()
this.state = {
num:1
}
}
componentDidMount(){
console.log(this.state.num)//1
this.setState({
num:2})
console.log(this.state.num)//1
setTimeout(()=>{
this.setState({
num:3})
console.log(this.state.num)//3
this.setState({
num:4})
console.log(this.state.num)//4
},0)
console.log(this.state.num)//1
}
setStateは非同期ですがsetStateが非同期に置かれると同期になります