如何在 React-Bootstrap 中使用 Redux-Form?
How to use Redux-Form with React-Bootstrap?
我正在尝试将 "redux-form": "^6.7.0" 与 "react-bootstrap": "^0.31.0"
一起使用
我的组件呈现得很好,但是当我按下提交时,我看到的是一个空对象。
注意:我试过先用 connect 包装配置,如下所示,先用 redux-form 包装它,然后用 from react-redux connect()
Configuration.js
class Config extends Component {
render() {
const { ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath, pickFile, pickFolder, handleSubmit } = this.props;
return (
<Form horizontal onSubmit={handleSubmit}>
<FormGroup controlId="serverPortBox">
<Col componentClass={ControlLabel} sm={2}>Watson Port:</Col>
<Col sm={10}>
<OverlayTrigger placement="left" overlay={(<Tooltip id="tt1">TCP port for Watson to use</Tooltip>)}>
<Field name="WatsonPort" component={FormControl}
type="number" min="1024" max="65535" placeholder={ServerPort} />
</OverlayTrigger>
</Col>
</FormGroup>
......
const CForm = reduxForm({
form: 'configuration' // a unique name for this form
})(Config);
const Configuration = connect(mapStateToProps, mapDispatchToProps)(CForm)
export default Configuration
reducers.js
import { combineReducers } from 'redux'
import { reducer as formReducer } from 'redux-form
......
const reducerList = {
GLVersion,
ServerConfig,
ServerStats,
form: formReducer
}
export default combineReducers(reducerList)
主包 Dashboard.js
我在调试器中看到的是配置是一个空对象
<Panel className='configPanel'
collapsible header="Configuration"
eventKey="1"
defaultExpanded={true}>
<Configuration onSubmit={(config) => writeConfig(config)} />
</Panel>
参见:https://github.com/erikras/redux-form/issues/2917
哦,这是一个很大的谜团。我遵循了 https://github.com/react-bootstrap/react-bootstrap/issues/2210 中的建议,关于额外道具的警告和空提交都停止了。
看来您必须将 Bootstrap 包装在您的自定义组件中(为什么?我不知道)。还要确保您的自定义组件是无状态功能组件,否则在第一次按键后,您的字段将模糊并失去焦点。
redux-form 的文档中有一些关于此的警告。
我的自定义字段组件FieldInput
const FieldInput = ({ input, meta, type, placeholder, min, max }) => {
return (
<FormControl
type={type}
placeholder={placeholder}
min={min}
max={max}
value={input.value}
onChange={input.onChange} />
)
}
我这样调用它:
<Field name="ServerPort"
type='number'
component={FieldInput}
placeholder={ServerPort}
min="1024" max="65535"
/>
另请参阅:https://github.com/erikras/redux-form/issues/1750
所以现在,FieldInput 和 Config 的定义如下所示:
import React, { Component } from 'react'
import { Field, reduxForm } from 'redux-form'
import { connect } from 'react-redux'
import { Form, FormControl, FormGroup, ControlLabel, Col, Button, Tooltip, OverlayTrigger } from 'react-bootstrap'
import * as Act from '../dash/actions.js'
import FaFolderOpen from 'react-icons/lib/fa/folder-open'
import FaFileCodeO from 'react-icons/lib/fa/file-code-o'
const FieldInput = ({ input, meta, type, placeholder, min, max }) => {
return (
<FormControl
type={type}
placeholder={placeholder}
min={min}
max={max}
value={input.value}
onChange={input.onChange} />
)
}
const Config = ({ ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath, pickFile, pickFolder, handleSubmit }) => {
return (
<Form horizontal onSubmit={handleSubmit}>
<FormGroup controlId="serverPortBox">
<Col componentClass={ControlLabel} sm={2}>Watson Port:</Col>
<Col sm={10}>
<OverlayTrigger placement="left" overlay={(<Tooltip id="tt1">TCP port for Watson to use</Tooltip>)}>
<Field name="ServerPort" type='number' min="1024" max="65535" component={FieldInput} placeholder={ServerPort} />
</OverlayTrigger>
</Col>
</FormGroup>
<FormControl>
需要的一些props从<Field>
传到props.input
里面,见http://redux-form.com/6.6.3/docs/api/Field.md/#props
要以通用方式传递所有这些道具,而不是明确地这样做,您可以使用以下函数:
const ReduxFormControl = ({input, meta, ...props}) => {
return <FormControl {...props} {...input} />
};
然后在表格内:
<Field component={ReduxFormControl} ... />
这样,value、onChange等都按预期传递给了<FormControl>
。
我正在尝试将 "redux-form": "^6.7.0" 与 "react-bootstrap": "^0.31.0"
一起使用我的组件呈现得很好,但是当我按下提交时,我看到的是一个空对象。
注意:我试过先用 connect 包装配置,如下所示,先用 redux-form 包装它,然后用 from react-redux connect()
Configuration.js
class Config extends Component {
render() {
const { ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath, pickFile, pickFolder, handleSubmit } = this.props;
return (
<Form horizontal onSubmit={handleSubmit}>
<FormGroup controlId="serverPortBox">
<Col componentClass={ControlLabel} sm={2}>Watson Port:</Col>
<Col sm={10}>
<OverlayTrigger placement="left" overlay={(<Tooltip id="tt1">TCP port for Watson to use</Tooltip>)}>
<Field name="WatsonPort" component={FormControl}
type="number" min="1024" max="65535" placeholder={ServerPort} />
</OverlayTrigger>
</Col>
</FormGroup>
......
const CForm = reduxForm({
form: 'configuration' // a unique name for this form
})(Config);
const Configuration = connect(mapStateToProps, mapDispatchToProps)(CForm)
export default Configuration
reducers.js
import { combineReducers } from 'redux'
import { reducer as formReducer } from 'redux-form
......
const reducerList = {
GLVersion,
ServerConfig,
ServerStats,
form: formReducer
}
export default combineReducers(reducerList)
主包 Dashboard.js
我在调试器中看到的是配置是一个空对象
<Panel className='configPanel'
collapsible header="Configuration"
eventKey="1"
defaultExpanded={true}>
<Configuration onSubmit={(config) => writeConfig(config)} />
</Panel>
参见:https://github.com/erikras/redux-form/issues/2917
哦,这是一个很大的谜团。我遵循了 https://github.com/react-bootstrap/react-bootstrap/issues/2210 中的建议,关于额外道具的警告和空提交都停止了。
看来您必须将 Bootstrap 包装在您的自定义组件中(为什么?我不知道)。还要确保您的自定义组件是无状态功能组件,否则在第一次按键后,您的字段将模糊并失去焦点。
redux-form 的文档中有一些关于此的警告。
我的自定义字段组件FieldInput
const FieldInput = ({ input, meta, type, placeholder, min, max }) => {
return (
<FormControl
type={type}
placeholder={placeholder}
min={min}
max={max}
value={input.value}
onChange={input.onChange} />
)
}
我这样调用它:
<Field name="ServerPort"
type='number'
component={FieldInput}
placeholder={ServerPort}
min="1024" max="65535"
/>
另请参阅:https://github.com/erikras/redux-form/issues/1750
所以现在,FieldInput 和 Config 的定义如下所示:
import React, { Component } from 'react'
import { Field, reduxForm } from 'redux-form'
import { connect } from 'react-redux'
import { Form, FormControl, FormGroup, ControlLabel, Col, Button, Tooltip, OverlayTrigger } from 'react-bootstrap'
import * as Act from '../dash/actions.js'
import FaFolderOpen from 'react-icons/lib/fa/folder-open'
import FaFileCodeO from 'react-icons/lib/fa/file-code-o'
const FieldInput = ({ input, meta, type, placeholder, min, max }) => {
return (
<FormControl
type={type}
placeholder={placeholder}
min={min}
max={max}
value={input.value}
onChange={input.onChange} />
)
}
const Config = ({ ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath, pickFile, pickFolder, handleSubmit }) => {
return (
<Form horizontal onSubmit={handleSubmit}>
<FormGroup controlId="serverPortBox">
<Col componentClass={ControlLabel} sm={2}>Watson Port:</Col>
<Col sm={10}>
<OverlayTrigger placement="left" overlay={(<Tooltip id="tt1">TCP port for Watson to use</Tooltip>)}>
<Field name="ServerPort" type='number' min="1024" max="65535" component={FieldInput} placeholder={ServerPort} />
</OverlayTrigger>
</Col>
</FormGroup>
<FormControl>
需要的一些props从<Field>
传到props.input
里面,见http://redux-form.com/6.6.3/docs/api/Field.md/#props
要以通用方式传递所有这些道具,而不是明确地这样做,您可以使用以下函数:
const ReduxFormControl = ({input, meta, ...props}) => {
return <FormControl {...props} {...input} />
};
然后在表格内:
<Field component={ReduxFormControl} ... />
这样,value、onChange等都按预期传递给了<FormControl>
。