我想弄清楚如何一起使用React,Redux和TypeScript来减少样板的数量。这可能是你不能在这种情况下,但想看看是否有人有想法。使用React,Redux和TypeScript映射DispatchToProps的更简单方法?
我目前有一个组件调度切换菜单的动作,在显示和隐藏它之间交替。要做到这一点,我定义我的课是这样的(涉及国家省略代码,注重行动的调度):
import {Action, toggleMenu} from "../../actions/index";
interface IConnectedDispatch {
toggleMenu: (isActive: boolean) => Action;
}
class HeaderMenu extends React.Component<IOwnProps & IConnectedState & IConnectedDispatch, any> {
constructor(props: IOwnProps & IConnectedState & IConnectedDispatch) {
super(props);
this.toggleMenuState = this.toggleMenuState.bind(this);
}
public render() {
return (
<button className={buttonClass} onClick={this.props.toggleMenu(this.props.isActive)} type="button">
</button>
);
}
}
const mapDispatchToProps = (dispatch: redux.Dispatch<Store.All>): IConnectedDispatch => ({
toggleMenu: (isActive: boolean) => dispatch(toggleMenu(isActive))});
动作被定义为
export function toggleMenu(isActive: boolean): Dispatch<Action> {
return (dispatch: Dispatch<Action>) => {
dispatch({
isActive,
type: "TOGGLE_MENU",
});
};
}
感觉就像它应该有可能减少完成我的目标所需的代码量。作为React,Redux和TypeScript的新手,我看不出究竟如何。具体来说,重复编写动作名称toggleMenu一遍又一遍。例如在这个部分两次:
const mapDispatchToProps = (dispatch: redux.Dispatch<Store.All>): IConnectedDispatch => ({
toggleMenu: (isActive: boolean) => dispatch(toggleMenu(isActive))});
任何意见表示赞赏!
太棒了!谢谢@niba! – langkilde
@niba你怎么称'连接'这个?除非我将'mapDispatchToProps'声明为'const mapDispatchToProps =(dispatch):IConnectedDispatch => {toggleMenu}','connect'并不能为我正确地推断出类型。我会用'export default ReactRedux.connect(mapStateToProps,mapDispatchToProps)(HeaderMenu)来调用它;'... – mikebridge
我不使用标准的'connect'。我有'connect'的特殊包装器,它可以自动从'mapStateToProps'和'mapDispatchToProps'中检索类型,我可以稍后将它放入我的容器定义中。无论如何,我只是试图做'connect(state => state,{... actions})(Component);'并且我没有看到任何问题。你的连接不能正确推断哪些类型? – niba