如何以正确的方式在 `redux` 中实现 `thunk` 来处理异步函数?
How to implement `thunk` in `redux` with correct way to handle async function?
这是我的商店,已实施 thunk
:
store/index.js
import { createStore, applyMiddleware } from "redux";
import reducer from "../reducers/";
import thunk from "redux-thunk";
const store = createStore(reducer, applyMiddleware(thunk));
export default store;
这是我的操作:
actions/index
:
export const remove = function(id) {
return {
type: "remove",
payload: setTimeout(function() {
return id;
}, 2000)
};
};
export const add = function() {};
export default { remove, add };
这是我的调度函数:
component/Item.js
import React from "react";
import { connect } from "react-redux";
import { bindActionCreators } from "redux";
import { remove } from "../actions/";
const Item = props => {
function removeTrigger() {
props.remove(props.item.id);
}
return (
<li>
{props.item.name} <button onClick={removeTrigger}>Delete</button>
</li>
);
};
function mapAction(dispatch) {
return bindActionCreators({ remove }, dispatch);
}
export default connect(
null,
mapAction
)(Item);
单击 delete
按钮时,我收到一条控制台消息。但是 id 没有被删除。有人帮我在这里正确地实现 thunk
优势吗?
Thunk 是一种中间件,只要您将函数而不是对象传递给动作创建者,它就会起作用。因此,要分派异步代码,假设您的组件已正确连接并映射 dispatchToProps
您的异步操作创建者应该如下所示:
export const remove = function(id){
return function(dispatch){
let id = null
setTimeout(()=> {
id = 1
dispatch({type: 'remove', payload:id})
}, 3000)
}
}
您还可以在 dispatch
旁边收到一个额外的参数,一个 getState
函数,允许您访问全局状态。
这是我的商店,已实施 thunk
:
store/index.js
import { createStore, applyMiddleware } from "redux";
import reducer from "../reducers/";
import thunk from "redux-thunk";
const store = createStore(reducer, applyMiddleware(thunk));
export default store;
这是我的操作:
actions/index
:
export const remove = function(id) {
return {
type: "remove",
payload: setTimeout(function() {
return id;
}, 2000)
};
};
export const add = function() {};
export default { remove, add };
这是我的调度函数:
component/Item.js
import React from "react";
import { connect } from "react-redux";
import { bindActionCreators } from "redux";
import { remove } from "../actions/";
const Item = props => {
function removeTrigger() {
props.remove(props.item.id);
}
return (
<li>
{props.item.name} <button onClick={removeTrigger}>Delete</button>
</li>
);
};
function mapAction(dispatch) {
return bindActionCreators({ remove }, dispatch);
}
export default connect(
null,
mapAction
)(Item);
单击 delete
按钮时,我收到一条控制台消息。但是 id 没有被删除。有人帮我在这里正确地实现 thunk
优势吗?
Thunk 是一种中间件,只要您将函数而不是对象传递给动作创建者,它就会起作用。因此,要分派异步代码,假设您的组件已正确连接并映射 dispatchToProps
您的异步操作创建者应该如下所示:
export const remove = function(id){
return function(dispatch){
let id = null
setTimeout(()=> {
id = 1
dispatch({type: 'remove', payload:id})
}, 3000)
}
}
您还可以在 dispatch
旁边收到一个额外的参数,一个 getState
函数,允许您访问全局状态。