рдЬрдм redux-form
рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ onChange
рдПрдХ "рдкрд░рд┐рд╡рд░реНрддрди" рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИ, рддреЛ рдпрд╣ AceEditor рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд░реНрд╕рд░ рд░рдЦрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ .. рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ
@ venil7 рдХреНрдпрд╛ рдЖрдк рдПрдХ рдПрд╕реАрдИ рд╕рдВрдкрд╛рджрдХ рдХреЛ рд░реЗрдбрдХреНрд╕-рдлреЙрд░реНрдо рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ?
рдореБрдЭреЗ рд╡рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдХреБрдЫ рдХреЛрдб рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
import React from 'react'
import AceEditor from 'react-ace'
export default function ReduxAce (props) {
const {
input,
theme = 'github',
mode = 'html',
fontSize = 14,
tabSize = 2,
width = '1000px',
height = '500px',
...custom
} = props
return (
<AceEditor
theme={theme}
mode={mode}
fontSize={fontSize}
tabSize={tabSize}
width={width}
height={height}
editorProps={{$blockScrolling: true}}
{...input}
{...custom}
/>
)
}
рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
import React from 'react'
import { reduxForm } from 'redux-form'
import ReduxAce from './path/to/ReduxAce'
function MyForm (props) {
const { handleSubmit } = props
return (
<form onSubmit={handleSubmit}>
<Field
name='staticHtml'
component={ReduxAce}
/>
</form>
)
}
export default reduxForm({
form: 'edit-static-html',
onSubmit (values, dispatch, props) {
console.log('submit...')
}
})(MyForm)
рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдореИрдВ рд░реЗрдбрдХреНрд╕-рдлреЙрд░реНрдо рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХреА рддрд░рд╣ - рдлрд╝реАрд▓реНрдб рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВред
рдЬрдм рднреА рд╕рдВрдкрд╛рджрдХ рдлрд╝реЛрдХрд╕ рдЦреЛ рджреЗрддрд╛ рд╣реИ, рддреЛ рдорд╛рди "" рдкрд░ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрдХреНрдХрд╛ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдЕрдВрджрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЗрд░рд╛ рдХреЛрдб рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ jschlieber рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ 'рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛'
рдРрд╕рдПрдбрд┐рдЯрд░ рдХреЛ 'рд░рд┐рдПрдХреНрд╢рди-рдРрд╕' рд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВ
рдЖрдпрд╛рдд _ 'рд▓реЙрд╢' рд╕реЗ;
рдЖрдпрд╛рдд 'рдмреНрд░реЗрд╕/рдореЛрдб/рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ';
рдЖрдпрд╛рдд 'рдмреНрд░реЗрд╕/рдереАрдо/рдореЛрдиреЛрдХрд╛рдИ';
рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рдВрдХреНрд╢рди ReduxAce (рдкреНрд░реЙрдкреНрд╕) {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (props.input.onBlur, рд╕рд╣рд╛рд░рд╛);
const {
input,
theme = 'monokai',
mode = 'javascript',
fontSize = 14,
tabSize = 2,
width = '1000px',
height = '500px',
...custom
} = props;
return (
<AceEditor
theme={theme}
mode={mode}
fontSize={fontSize}
tabSize={tabSize}
width={width}
height={height}
onBlur={() => props.input.onBlur(props.input.value)}
editorProps={{$blockScrolling: Infinity}}
{...input}
{...custom}
/>
)
}`
рддрдерд╛
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ 'рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, {рдШрдЯрдХ};
'рд░рд┐рдПрдХреНрд╢рди-рд░реЗрдбрдХреНрд╕' рд╕реЗ рдЖрдпрд╛рдд {рдХрдиреЗрдХреНрдЯ};
рдЖрдпрд╛рдд { saveDraft } '../actions/index' рд╕реЗ;
'рд░реЗрдбрдХреНрд╕' рд╕реЗ рдЖрдпрд╛рдд {bindActionCreators};
рдЖрдпрд╛рдд {рдлрд╝реАрд▓реНрдб, reduxForm} 'redux-form' рд╕реЗ;
ReduxAce рдХреЛ '../components/redux_ace' рд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВ
рдХреЙрдиреНрд╕реНрдЯ рдЖрдИрдбреА = 'id123', NAME = 'name123', SOME_CODE = 'code123';
рдлрд╝рдВрдХреНрд╢рди рдореИрдкрд╕реНрдЯреЗрдЯрдЯреЙрдкрдкреНрд░реЙрдкреНрд╕ ({рдбреНрд░рд╛рдлреНрдЯ}) тАЛтАЛ{
рд╡рд╛рдкрд╕реА {
рдкреНрд░рд╛рд░реВрдк
};
}
рдлрд╝рдВрдХреНрд╢рди рдореИрдкрдбрд┐рд╕реНрдкреИрдЪрдЯреЙрдкрдкреНрд░реЙрдкреНрд╕ (рдкреНрд░реЗрд╖рдг) {
рд╡рд╛рдкрд╕реА рдмрд╛рдЗрдВрдбрдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░({
рд▓рд┐рдЦрд┐рдд рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░реЛ
}, рдкреНрд░реЗрд╖рдг)
}
рдХреНрд▓рд╛рд╕ рдбреНрд░рд╛рдлреНрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ {
renderField(field) {
return (
<div className="form-group">
<label>{field.label}</label>
<input
className="form-control"
type="text"
{...field.input}
/>
</div>
)
}
onSubmit(values) {
console.log('sub',values);
this.props.saveDraft({
id: values[ID],
name: values[NAME],
code: values[SOME_CODE]
});
}
render() {
const { handleSubmit } = this.props;
return (
<form onSubmit={handleSubmit(this.onSubmit.bind(this))}>
<Field
label="Id"
name={ID}
component={this.renderField}
/>
<Field
label="Name"
name={NAME}
component={this.renderField}
/>
<Field
label="Lambda code"
name={SOME_CODE}
component={ReduxAce}
/>
// if I put it here, then it suddenly works fine <ReduxAce/>
<button type="submit" className="btn btn-primary"> Submit</button>
</form>
);
}
}
рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ reduxForm({
рдорд╛рдиреНрдп рдХрд░рдирд╛,
рдлреЙрд░реНрдо: 'рдбреНрд░рд╛рдлреНрдЯрдлреЙрд░реНрдо'
})(
рдХрдиреЗрдХреНрдЯ (mapStateToProps, mapDispatchToProps) (рдбреНрд░рд╛рдлреНрдЯ)
)`
рдмрдЯрди рдХреЗ рдареАрдХ рдкрд╣рд▓реЗ рдореИрдВ рдЕрднреА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдбрд╛рд▓рддрд╛ рд╣реВрдВ, "//рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд░рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЕрдЪрд╛рдирдХ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдХрд┐рд╕реА рднреА рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!