React-ace: рд░реЗрдбрдХреНрд╕-рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓рддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдЬреВрди 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: securingsincity/react-ace

рдЬрдм redux-form рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ onChange рдПрдХ "рдкрд░рд┐рд╡рд░реНрддрди" рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИ, рддреЛ рдпрд╣ AceEditor рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд░реНрд╕рд░ рд░рдЦрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ .. рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ 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) (рдбреНрд░рд╛рдлреНрдЯ)
)`

рдмрдЯрди рдХреЗ рдареАрдХ рдкрд╣рд▓реЗ рдореИрдВ рдЕрднреА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдбрд╛рд▓рддрд╛ рд╣реВрдВ, "//рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд░рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЕрдЪрд╛рдирдХ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ " - рддреЛ рд╣рд╛рдБ, рдЕрдЧрд░ рдореИрдВ рдРрд╕ рд╕рдВрдкрд╛рджрдХ рдХреЛ рдлрд╝реАрд▓реНрдб рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛, рддреЛ рдЙрд╕рдХрд╛ рдорд╛рди рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдХреИрд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдСрдирдмреНрд▓рд░ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдореВрд▓реНрдп рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред

рдХрд┐рд╕реА рднреА рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

viridia picture viridia  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ponelat picture ponelat  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Bobcui001 picture Bobcui001  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tsmirnov picture tsmirnov  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dmavrin picture dmavrin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ