React Redux 表单和连接语法
React Redux form and connect syntax
我有一个 React 组件
export class Login extends Component {
..omitted for clarity
}
export default connect(select, actions)(Login);
并且可以看出它连接到 Redux 并且运行良好
我有 Redux 表单
export class ChangePassword extends Component {
..omitted for clarity
}
export default reduxForm({
form: 'change_password_form',
validate
})(ChangePassword);
同样,这工作得很好。
我的问题是,我无法计算出让 Redux 形式也能使用连接语句的语法,例如connect(select, actions)
是这样的吗?
export default reduxForm({
form: 'change_password_form',
validate
}).connect(select, actions)(ChangePassword)
由于 connect
方法修饰了原始组件,而 returns 修饰了组件,您可以将该组件传递给 reduxForm
(Redux Form FAQ).
您可以在文档中查看示例。
const decoratedComponent = connect(select, actions)(ChangePassword)
export default reduxForm({
form: 'change_password_form',
validate
})(DecoratedComponent)
或者直接传过去:
export default reduxForm({
form: 'change_password_form',
validate
})(connect(select, actions)(ChangePassword))
如果需要从store中获取数据,比如-to create the form's initial values from the state,可以将原来的组件用redux-form包裹起来,将"form"组件传给connect
:
export default connect(select, actions)(reduxForm({
form: 'change_password_form',
validate
})(ChangePassword))
或者您可以使用 compose
方法(例如来自 redux/lodash/ramda 的函数组合)调用 reduxForm
,然后在组件上调用 connect
:
export default compose(
connect(mapStateToProps, mapDispatchToProps),
reduxForm({ form: 'change_password_form', validate })
)(ChangePassword)
应用多个中间件是这样的:
middlewareB(middlewareA(Component))
你的情况:
export default connect(select, actions)(reduxForm({})(ChangePassword))
您可以做的是在 redux 表单之上创建一个包装器 class 并将其连接到 redux。你可以简单地将 props 从包装器 class 传递给 redux 表单。像这样:
//redux form
export class ChangePassword extends Component {
..omitted for clarity
}
export default reduxForm({
form: 'change_password_form',
validate
})(ChangePassword);
// wrapper class
export class FormWrapper extends React.Component {
// omitted for clarity
}
export default connect(select, actions)(FormWrapper);
我可以保证这个有效,此处的 TypeScript 可选:
(我正在使用 combineReducer,因此将嵌套状态导入到组件属性中。)
这里的分别是mapStateToProps,导入的Action Creators,以及用Redux Form包裹的React Component。
const mapStateToProps = (state: any) => ({
currentItems: state.itemsReducer.currentItem,
initialValues: state.itemsReducer.currentItem,
keepDirtyOnReinitialize: true,
});
//ReduxForm decorator populates the initialValues prop
//from Connect into Field components with its library functionality:
export default connect<any, any, any>(mapStateToProps, {
CreateItem,
UpdateItem,
getItemById
})(reduxForm({
form: 'ItemsForm'
})(AddItemToList))
我有一个 React 组件
export class Login extends Component {
..omitted for clarity
}
export default connect(select, actions)(Login);
并且可以看出它连接到 Redux 并且运行良好
我有 Redux 表单
export class ChangePassword extends Component {
..omitted for clarity
}
export default reduxForm({
form: 'change_password_form',
validate
})(ChangePassword);
同样,这工作得很好。
我的问题是,我无法计算出让 Redux 形式也能使用连接语句的语法,例如connect(select, actions)
是这样的吗?
export default reduxForm({
form: 'change_password_form',
validate
}).connect(select, actions)(ChangePassword)
由于 connect
方法修饰了原始组件,而 returns 修饰了组件,您可以将该组件传递给 reduxForm
(Redux Form FAQ).
您可以在文档中查看示例。
const decoratedComponent = connect(select, actions)(ChangePassword)
export default reduxForm({
form: 'change_password_form',
validate
})(DecoratedComponent)
或者直接传过去:
export default reduxForm({
form: 'change_password_form',
validate
})(connect(select, actions)(ChangePassword))
如果需要从store中获取数据,比如-to create the form's initial values from the state,可以将原来的组件用redux-form包裹起来,将"form"组件传给connect
:
export default connect(select, actions)(reduxForm({
form: 'change_password_form',
validate
})(ChangePassword))
或者您可以使用 compose
方法(例如来自 redux/lodash/ramda 的函数组合)调用 reduxForm
,然后在组件上调用 connect
:
export default compose(
connect(mapStateToProps, mapDispatchToProps),
reduxForm({ form: 'change_password_form', validate })
)(ChangePassword)
应用多个中间件是这样的:
middlewareB(middlewareA(Component))
你的情况:
export default connect(select, actions)(reduxForm({})(ChangePassword))
您可以做的是在 redux 表单之上创建一个包装器 class 并将其连接到 redux。你可以简单地将 props 从包装器 class 传递给 redux 表单。像这样:
//redux form
export class ChangePassword extends Component {
..omitted for clarity
}
export default reduxForm({
form: 'change_password_form',
validate
})(ChangePassword);
// wrapper class
export class FormWrapper extends React.Component {
// omitted for clarity
}
export default connect(select, actions)(FormWrapper);
我可以保证这个有效,此处的 TypeScript 可选:
(我正在使用 combineReducer,因此将嵌套状态导入到组件属性中。)
这里的
const mapStateToProps = (state: any) => ({
currentItems: state.itemsReducer.currentItem,
initialValues: state.itemsReducer.currentItem,
keepDirtyOnReinitialize: true,
});
//ReduxForm decorator populates the initialValues prop
//from Connect into Field components with its library functionality:
export default connect<any, any, any>(mapStateToProps, {
CreateItem,
UpdateItem,
getItemById
})(reduxForm({
form: 'ItemsForm'
})(AddItemToList))