React-ace: ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ace Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Field Π² Redux-Form

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 18 Π΄Π΅ΠΊ. 2017  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: securingsincity/react-ace

Π£ мСня сСйчас аналогичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с https://github.com/securingsincity/react-ace/issues/120 .

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

Мой ΠΊΠΎΠ΄ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° jschlieber Π² исходном ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ, посмотритС:

import React from 'react'
import AceEditor from 'react-ace'
import _ from 'lodash';

import 'brace/mode/javascript';
import 'brace/theme/monokai';

export default function ReduxAce (props) {
    console.log(props.input.onBlur, props);

    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}
        />
    )
}

Π° Ρ‚Π°ΠΊΠΆΠ΅

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { saveDraft } from '../actions/index';
import { bindActionCreators } from 'redux';
import { Field, reduxForm } from 'redux-form';
import ReduxAce from '../components/redux_ace'

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

function mapStateToProps({draft}) {
    return {
        draft
    };
}

function mapDispatchToProps(dispatch) {
    return bindActionCreators({
        saveDraft
    }, dispatch)
}


class Draft extends Component {
    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>
        );
    }
}

export default reduxForm({
    validate,
    form: 'DraftForm' 
})(
    connect(mapStateToProps, mapDispatchToProps)(Draft)
)

прямо ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ я поставил ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ // if I put it here, then it suddenly works fine <ReduxAce/> - Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°, Ссли я ΠΏΠΎΡΡ‚Π°Π²Π»ΡŽ Ace Editor ΠΊΠ°ΠΊ Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ поля, Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, я пытался ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ onBlur ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ смог.

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

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

const aceOnBlur = (onBlur) => (_event, editor?) => {
    const value = editor.getValue();
    onBlur(value);
};

...
return (
    <AceEditor
          className={className}
          mode='html'
          theme='monokai'
          enableBasicAutocompletion={true}
          showPrintMargin={false}
          tabSize={4}
          setOptions={options}
          width='1000px'
          name={input.name}
          onBlur={aceOnBlur(input.onBlur)}
          onChange={input.onChange}
          onFocus={input.onFocus}
          value={input.value}
    />
)

Ρƒ мСня ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

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

Π£ мСня такая ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π― Π½Π΅ Π²ΠΈΠΆΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с вСрсиСй 5.1.1 , Π½ΠΎ Π² 5.8.0 это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π‘ΡƒΠ΄Ρƒ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ, Ссли смогу Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ.

const aceOnBlur = (onBlur) => (_event, editor?) => {
    const value = editor.getValue();
    onBlur(value);
};

...
return (
    <AceEditor
          className={className}
          mode='html'
          theme='monokai'
          enableBasicAutocompletion={true}
          showPrintMargin={false}
          tabSize={4}
          setOptions={options}
          width='1000px'
          name={input.name}
          onBlur={aceOnBlur(input.onBlur)}
          onChange={input.onChange}
          onFocus={input.onFocus}
          value={input.value}
    />
)

Ρƒ мСня ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

@drewen @spoonscen - ΠΊΠΎΠ³ΠΎ- Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ· вас прСдлоТСния ΠΏΠΎ этому

@avalkowsky - Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅

@drewen Π― расскаТу Π²Π°ΠΌ подробности Π·Π°Π²Ρ‚Ρ€Π°!

@JFFby ΠΈΠ·Π²ΠΈΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это заняло Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠ·ΠΎΡ€ ΠΌΠ½Π΅.

Π’Π°ΡˆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚!

@drewen спасибо, я это пропустил πŸ‘

@ taylordowns2000

Π― Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠ·ΠΈΠ» Π²Π΅Ρ€ΡΠΈΡŽ react-ace Π΄ΠΎ 5.1.1 ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Π±Π΅Π· ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° onBlur, Π½ΠΎ это Π½Π΅ сработало.
Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, я ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΠ» Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½ΠΎ Ссли Π±Ρ‹ я Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ ΠΈΠ· Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΠΌΡΡ с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, я Π±Ρ‹ использовал Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ JFFbys :)

ВсСм спасибо Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ!

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