React-ace: Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π΅Π΄ΡƒΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 28 июн. 2016  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: securingsincity/react-ace

ΠŸΡ€ΠΈ использовании с redux-form , Π° onChange отправляСт дСйствиС Β«ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΒ», это заставляСт AceEditor ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ курсор Π² ΠΊΠΎΠ½Π΅Ρ† Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°.. прСдотвращая внСсСниС ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

@ venil7 , Π²Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ACE Π² рСдукс-Ρ„ΠΎΡ€ΠΌΡƒ?
Π― Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, поТалуйста?

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)

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ просто, ΠΈ это прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚!

Π£ мСня сСйчас аналогичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ react-ace Π²Π½ΡƒΡ‚Ρ€ΠΈ redux-form, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Field, ΠΊΠ°ΠΊ ΠΈ Π²Ρ‹ΡˆΠ΅.
ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ тСряСт фокус, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ устанавливаСтся Π½Π° "" ΠΈ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ace ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠΈ.

Мой ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» jschlieber, взглянитС:

`ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React ΠΈΠ· 'Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ'
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ AceEditor ΠΈΠ· Β«React-aceΒ»
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ _ ΠΈΠ· 'lodash';

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 'скобку/Ρ€Π΅ΠΆΠΈΠΌ/javascript';
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ скобку/Ρ‚Π΅ΠΌΡƒ/ΠΌΠΎΠ½ΠΎΠΊΠ°ΠΉ;

функция экспорта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ReduxAce (Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚) {
console.log(Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹.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}
    />
)

}`

ΠΈ

`ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React, {ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚} ΠΈΠ· 'Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ';
ΠΈΠΌΠΏΠΎΡ€Ρ‚ {connect} ΠΈΠ· 'Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ-рСдукс';
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ { saveDraft } ΠΈΠ· '../actions/index';
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ {bindActionCreators} ΠΈΠ· Β«Ρ€Π΅Π΄ΡƒΠΊΡ†ΠΈΠΈΒ»;
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ {Field, reduxForm} ΠΈΠ· 'redux-form';
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ReduxAce ΠΈΠ· '../components/redux_ace'

const ID = 'id123', NAME = 'name123', SOME_CODE = 'code123';

функция mapStateToProps ({Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ}) {
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ {
Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ
};
}

функция mapDispatchToProps (ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ°) {
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ bindActionCreators({
ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒΠ§Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ
}, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ)
}

класс Draft Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ {

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) (Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ)
)`

просто ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ я поставил ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСйчас, "//Ссли я ΠΏΠΎΡΡ‚Π°Π²Π»ΡŽ Π΅Π³ΠΎ здСсь, Ρ‚ΠΎ ΠΎΠ½ Π²Π΄Ρ€ΡƒΠ³ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ " - Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°, Ссли я ΡΡ‚Π°Π²Π»ΡŽ Ace Editor ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Field, Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ удаляСтся. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, я пытался ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ onBlur ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ смог.

Бпасибо Π·Π° Π»ΡŽΠ±Ρ‹Π΅ подсказки!

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ