Redux-Form 无法进行远程提交
Redux-Form can't do a remote submit
我正在尝试按如下方式http://redux-form.com/6.6.1/examples/remoteSubmit/使用此功能:
在 index.js
我声明了一个关闭模态组件(包含 redux 表单)的函数,以及一个分派提交操作的函数(用于远程提交).两者都通过道具传递给 AccountScene(一个演示组件)。
On layout.js
AccountScene
组件通过 props 将两个函数传递给 CreateAccount.js
(包含表单的最终组件)。
在最后一个组件中,我需要在 UTModal
组件上按 acceptButton
时提交表单(在此测试用例中,关闭模式)。
我尝试将此配置参数传递给 redux-form 装饰器:onSubmit: submitModal
,但抛出 error: 'submitModal' is not defined
.
提前致谢。
index.js
class AccountsContainer extends Component {
state = { modalIsOpen: false };
handlePress = () => {
this.setState({ modalIsOpen: true });
};
handleModalClose = () => {
this.setState({ modalIsOpen: false });
};
submit = values => {
this.props.dispatch(submit('createaccount'));
};
render() {
return (
<AccountScene
onCreateAccount={this.handlePress}
modalIsOpen={this.state.modalIsOpen}
closeModal={this.handleModalClose}
accounts={this.props.accounts}
submitModal={this.submit}
/>
);
}
}
AccountsContainer.propTypes = {
accounts: accountPropTypes().accounts
};
const mapStateToProps = store => ({
accounts: store.account.accounts
});
export default connect(mapStateToProps)(AccountsContainer);
layout.js
function AccountScene({ onCreateAccount, modalIsOpen, closeModal, accounts, submitModal }) {
return (
<div>
<SecondaryTopbar
titleText={i18next.t('accounts:accounts')}
titleIcon={icon}
iconAltText={i18next.t('accounts:accounts')}
>
<UTButton base onPress={onCreateAccount} green type="submit">
{i18next.t('accounts:addAccount')}
</UTButton>
</SecondaryTopbar>
<AccountList accounts={accounts} />
<CreateAccount modalIsOpen={modalIsOpen} closeModal={closeModal} submitModal={submitModal} onSubmit={closeModal} />
</div>
);
}
AccountScene.propTypes = {
onCreateAccount: PropTypes.func,
modalIsOpen: PropTypes.bool.isRequired,
closeModal: PropTypes.func.isRequired,
accounts: accountPropTypes().accounts
};
export default reduxForm({ form: 'createaccount' })(AccountScene);
CreateAccount.js
let CreateAccount = props => {
const {closeModal, modalIsOpen, submitModal, handleSubmit} = props
return (
<div>
<UTModal
isOpen={modalIsOpen}
onRequestClose={() => this.setState({ modalIsOpen: false })}
acceptButton={{ text: 'Add', onPress: () => "I need to submit form here!" }}
title={'Create account'}
>
<UTLabel black>Some text</UTLabel>
<div>
<form onSubmit={handleSubmit} noValidate>
<Field
component={UTFormInput}
name="accountNumber"
type="text"
placeholder="Customer Number"
validate={[InputValidations.required('Required')]}
/>
</form>
</div>
</UTModal>
</div>
);
}
CreateAccount.propTypes = {
modalIsOpen: PropTypes.bool.isRequired,
closeModal: PropTypes.func.isRequired
};
export default reduxForm({ form: 'createaccount', onSubmit: submitModal })(CreateAccount);
您正在尝试将 submitModal
函数传递给连接的组件。不幸的是,您只能在传入的 CreateAccount
范围内访问 submitModal
函数。在您提供的示例中, submit
函数是在任何 [=15] 之外定义的=] 类 并导入到正确的文件中。尝试将它放在自己的文件中或在 AccountsContainer
组件之外定义它并单独导出它。
您需要在此处进行几处更改:
import { submit } from 'redux-form';
import { connect } from 'react-redux';
import yourSubmit from 'your/path/to/submit';
let CreateAccount = props => {
const {closeModal, modalIsOpen, handleSubmit} = props
return (
<div>
<UTModal
isOpen={modalIsOpen}
onRequestClose={() => this.setState({ modalIsOpen: false })}
acceptButton={{ text: 'Add', onPress: props.dispatch(submit('createaccount'))) }}
/>
.
.
.
CreateAccount = reduxForm({ form: 'createaccount', onSubmit: yourSubmit })(CreateAccount);
CreateAccount = connect()(CreateAccount);
export default CreateAccount;
我找到了我的答案,为了代码工作我需要这样做:
index.js
- 声明 handleSubmit 函数 dispatch(submit('form name'))
- 通过道具将 handleSubmit 和 handleModalClose(用于 onSubmit 点)传递给 AccountScene
.
class AccountsContainer extends Component {
state = { modalIsOpen: false };
handlePress = () => {
this.setState({ modalIsOpen: true });
};
handleModalClose = (values) => {
this.setState({ modalIsOpen: false });
};
handleSubmit = () => {
this.props.dispatch(submit('createaccount'));
}
render() {
return (
<AccountScene
onCreateAccount={this.handlePress}
modalIsOpen={this.state.modalIsOpen}
closeModal={this.handleModalClose}
accounts={this.props.accounts}
handleSubmit={this.handleSubmit}
/>
);
}
}
layout.js:通过 props 传递给 CreateAccount handleSubmit 和 onSubmit= closeModal。
function AccountScene({ onCreateAccount, modalIsOpen, closeModal, accounts, handleSubmit }) {
return (
<div>
<SecondaryTopbar
titleText={i18next.t('accounts:accounts')}
titleIcon={icon}
iconAltText={i18next.t('accounts:accounts')}
>
<UTButton base onPress={onCreateAccount} green type="submit">
{i18next.t('accounts:addAccount')}
</UTButton>
</SecondaryTopbar>
<AccountList accounts={accounts} />
<CreateAccount modalIsOpen={modalIsOpen} closeModal={closeModal} handleSubmit={handleSubmit} onSubmit={closeModal} />
</div>
);
}
终于在 CreateAccount.js
- 接收 handleSubmit 和 onSubmit 道具
- 在模态 acceptButton 上使用 handleSubmit。
- 在没有onSubmit配置的情况下将onSubmit传递给redux-form组件
装饰器。
:
function CreateAccount({modalIsOpen, closeModal, handleSubmit, onSubmit}) {
return (
<div>
<UTModal
isOpen={modalIsOpen}
onRequestClose={() => this.setState({ modalIsOpen: false })}
acceptButton={{ text: 'Add', onPress: handleSubmit }}
title={'Create account'}
>
<UTLabel black>Some text</UTLabel>
<div>
<form onSubmit={onSubmit} noValidate>
<Field
component={UTTextInput}
name="accountNumber"
type="text"
placeholder="Customer Number"
validate={[InputValidations.required('Required')]}
/>
</form>
</div>
</UTModal>
</div>
);
}
CreateAccount.propTypes = {
modalIsOpen: PropTypes.bool.isRequired,
closeModal: PropTypes.func.isRequired
};
export default reduxForm({ form: 'createaccount' })(CreateAccount);
我希望这个解决方案可以为有类似问题的其他人服务。
我正在尝试按如下方式http://redux-form.com/6.6.1/examples/remoteSubmit/使用此功能:
在 index.js
我声明了一个关闭模态组件(包含 redux 表单)的函数,以及一个分派提交操作的函数(用于远程提交).两者都通过道具传递给 AccountScene(一个演示组件)。
On layout.js
AccountScene
组件通过 props 将两个函数传递给 CreateAccount.js
(包含表单的最终组件)。
在最后一个组件中,我需要在 UTModal
组件上按 acceptButton
时提交表单(在此测试用例中,关闭模式)。
我尝试将此配置参数传递给 redux-form 装饰器:onSubmit: submitModal
,但抛出 error: 'submitModal' is not defined
.
提前致谢。
index.js
class AccountsContainer extends Component {
state = { modalIsOpen: false };
handlePress = () => {
this.setState({ modalIsOpen: true });
};
handleModalClose = () => {
this.setState({ modalIsOpen: false });
};
submit = values => {
this.props.dispatch(submit('createaccount'));
};
render() {
return (
<AccountScene
onCreateAccount={this.handlePress}
modalIsOpen={this.state.modalIsOpen}
closeModal={this.handleModalClose}
accounts={this.props.accounts}
submitModal={this.submit}
/>
);
}
}
AccountsContainer.propTypes = {
accounts: accountPropTypes().accounts
};
const mapStateToProps = store => ({
accounts: store.account.accounts
});
export default connect(mapStateToProps)(AccountsContainer);
layout.js
function AccountScene({ onCreateAccount, modalIsOpen, closeModal, accounts, submitModal }) {
return (
<div>
<SecondaryTopbar
titleText={i18next.t('accounts:accounts')}
titleIcon={icon}
iconAltText={i18next.t('accounts:accounts')}
>
<UTButton base onPress={onCreateAccount} green type="submit">
{i18next.t('accounts:addAccount')}
</UTButton>
</SecondaryTopbar>
<AccountList accounts={accounts} />
<CreateAccount modalIsOpen={modalIsOpen} closeModal={closeModal} submitModal={submitModal} onSubmit={closeModal} />
</div>
);
}
AccountScene.propTypes = {
onCreateAccount: PropTypes.func,
modalIsOpen: PropTypes.bool.isRequired,
closeModal: PropTypes.func.isRequired,
accounts: accountPropTypes().accounts
};
export default reduxForm({ form: 'createaccount' })(AccountScene);
CreateAccount.js
let CreateAccount = props => {
const {closeModal, modalIsOpen, submitModal, handleSubmit} = props
return (
<div>
<UTModal
isOpen={modalIsOpen}
onRequestClose={() => this.setState({ modalIsOpen: false })}
acceptButton={{ text: 'Add', onPress: () => "I need to submit form here!" }}
title={'Create account'}
>
<UTLabel black>Some text</UTLabel>
<div>
<form onSubmit={handleSubmit} noValidate>
<Field
component={UTFormInput}
name="accountNumber"
type="text"
placeholder="Customer Number"
validate={[InputValidations.required('Required')]}
/>
</form>
</div>
</UTModal>
</div>
);
}
CreateAccount.propTypes = {
modalIsOpen: PropTypes.bool.isRequired,
closeModal: PropTypes.func.isRequired
};
export default reduxForm({ form: 'createaccount', onSubmit: submitModal })(CreateAccount);
您正在尝试将 submitModal
函数传递给连接的组件。不幸的是,您只能在传入的 CreateAccount
范围内访问 submitModal
函数。在您提供的示例中, submit
函数是在任何 [=15] 之外定义的=] 类 并导入到正确的文件中。尝试将它放在自己的文件中或在 AccountsContainer
组件之外定义它并单独导出它。
您需要在此处进行几处更改:
import { submit } from 'redux-form';
import { connect } from 'react-redux';
import yourSubmit from 'your/path/to/submit';
let CreateAccount = props => {
const {closeModal, modalIsOpen, handleSubmit} = props
return (
<div>
<UTModal
isOpen={modalIsOpen}
onRequestClose={() => this.setState({ modalIsOpen: false })}
acceptButton={{ text: 'Add', onPress: props.dispatch(submit('createaccount'))) }}
/>
.
.
.
CreateAccount = reduxForm({ form: 'createaccount', onSubmit: yourSubmit })(CreateAccount);
CreateAccount = connect()(CreateAccount);
export default CreateAccount;
我找到了我的答案,为了代码工作我需要这样做:
index.js
- 声明 handleSubmit 函数 dispatch(submit('form name'))
- 通过道具将 handleSubmit 和 handleModalClose(用于 onSubmit 点)传递给 AccountScene
.
class AccountsContainer extends Component {
state = { modalIsOpen: false };
handlePress = () => {
this.setState({ modalIsOpen: true });
};
handleModalClose = (values) => {
this.setState({ modalIsOpen: false });
};
handleSubmit = () => {
this.props.dispatch(submit('createaccount'));
}
render() {
return (
<AccountScene
onCreateAccount={this.handlePress}
modalIsOpen={this.state.modalIsOpen}
closeModal={this.handleModalClose}
accounts={this.props.accounts}
handleSubmit={this.handleSubmit}
/>
);
}
}
layout.js:通过 props 传递给 CreateAccount handleSubmit 和 onSubmit= closeModal。
function AccountScene({ onCreateAccount, modalIsOpen, closeModal, accounts, handleSubmit }) {
return (
<div>
<SecondaryTopbar
titleText={i18next.t('accounts:accounts')}
titleIcon={icon}
iconAltText={i18next.t('accounts:accounts')}
>
<UTButton base onPress={onCreateAccount} green type="submit">
{i18next.t('accounts:addAccount')}
</UTButton>
</SecondaryTopbar>
<AccountList accounts={accounts} />
<CreateAccount modalIsOpen={modalIsOpen} closeModal={closeModal} handleSubmit={handleSubmit} onSubmit={closeModal} />
</div>
);
}
终于在 CreateAccount.js
- 接收 handleSubmit 和 onSubmit 道具
- 在模态 acceptButton 上使用 handleSubmit。
- 在没有onSubmit配置的情况下将onSubmit传递给redux-form组件 装饰器。
:
function CreateAccount({modalIsOpen, closeModal, handleSubmit, onSubmit}) {
return (
<div>
<UTModal
isOpen={modalIsOpen}
onRequestClose={() => this.setState({ modalIsOpen: false })}
acceptButton={{ text: 'Add', onPress: handleSubmit }}
title={'Create account'}
>
<UTLabel black>Some text</UTLabel>
<div>
<form onSubmit={onSubmit} noValidate>
<Field
component={UTTextInput}
name="accountNumber"
type="text"
placeholder="Customer Number"
validate={[InputValidations.required('Required')]}
/>
</form>
</div>
</UTModal>
</div>
);
}
CreateAccount.propTypes = {
modalIsOpen: PropTypes.bool.isRequired,
closeModal: PropTypes.func.isRequired
};
export default reduxForm({ form: 'createaccount' })(CreateAccount);
我希望这个解决方案可以为有类似问题的其他人服务。