react統合原生redux(二)
3087 ワード
react統合原生redux(二)
前言
react統合原生redux(一)では基本的なアプリケーションフレームワークが完成しているが,actionを配布する際にはactionにロジックを書くことはできない,換言すればactionは常にjsonオブジェクトであり,関数ではなく,ビューライフサイクル内にロジックメソッドを書くことでstateの数値を変えることができるが,これまではプロジェクトが肥大化し,メンテナンスが困難になる.react-thunkミドルウェアは
プロジェクトの作成
参照react統合原生redux(一)
依存パッケージの追加
srcファイルディレクトリ
|-app.js|-store.js|-index.js|-actions.js
action.jsコンテンツ
store変更
完全なコード
app.jsで呼び出す
主にこの部分です
完全なコード
これにより、一般的な中小規模プロジェクトのニーズに対応し、完全なコードを表示できます.
一般的に大型プロジェクト用redux-sagaはreact統合原生redux(三)を参照
前言
react統合原生redux(一)では基本的なアプリケーションフレームワークが完成しているが,actionを配布する際にはactionにロジックを書くことはできない,換言すればactionは常にjsonオブジェクトであり,関数ではなく,ビューライフサイクル内にロジックメソッドを書くことでstateの数値を変えることができるが,これまではプロジェクトが肥大化し,メンテナンスが困難になる.react-thunkミドルウェアは
プロジェクトの作成
参照react統合原生redux(一)
依存パッケージの追加
yarn add redux-thunk -s
srcファイルディレクトリ
|-app.js|-store.js|-index.js|-actions.js
actions.js , action
action.jsコンテンツ
// actions.js
/**
* redux-thunk action , dispatch
*
* function () {
* return function (dispatch) {
* dispatch(...)
* }
* }
*/
export const fetchListAction = param => {
return dispatch => {
// (fetch,axios )
new Promise(resolve => {
setTimeout(() => {
const data = {
code: 0,
msg: "ok",
data: {
list: ["hello", "thunk"],
param
}
};
resolve(data);
}, 2000);
}).then(result => {
dispatch({ type: "SAVE", payload: result.data });
});
};
};
store変更
redux-thunk
完全なコード
// store.js
import { createStore, applyMiddleware } from "redux";
import thunk from "redux-thunk";
import { composeWithDevTools } from "redux-devtools-extension"; //chrome redux
// state
const initState = {
list: ["a", "b"]
};
// reducer
const reducer = (state = initState, action) => {
const { type, payload } = action;
// action type
if (type === "SAVE") {
return Object.assign({}, state, payload);
}
return state;
};
/**
* store
* 1: reducer
* 2:
*/
export default createStore(
reducer,
composeWithDevTools(applyMiddleware(thunk))
);
app.jsで呼び出す
主にこの部分です
useEffect(() => {
store.dispatch(fetchListAction({ id: 1 }));
}, []);
完全なコード
// app.js
import React, { useState, useEffect } from "react";
import store from "./store";
import { fetchListAction } from "./actions";
export default () => {
// store state, hook , this.setState(store.getState())
const [state, setState] = useState(store.getState());
useEffect(() => {
// store , state store.dispatch action
store.subscribe(() => {
setState(store.getState()); // state ,
});
}, []); // []
//
useEffect(() => {
store.dispatch(fetchListAction({ id: 1 }));
}, []);
const { list } = state;
const addList = () => {
list.push(Date.now());
store.dispatch({ type: "SAVE", payload: { list } }); // action
};
return (
{list.map(v => {
return - {v}
;
})}
);
};
これにより、一般的な中小規模プロジェクトのニーズに対応し、完全なコードを表示できます.
一般的に大型プロジェクト用redux-sagaはreact統合原生redux(三)を参照