React-ace: Problema con ace dentro del componente de campo de Redux-Form

Creado en 18 dic. 2017  ·  6Comentarios  ·  Fuente: securingsincity/react-ace

Tengo un problema similar a https://github.com/securingsincity/react-ace/issues/120 en este momento.

Estoy usando react-ace dentro de redux-form, como un componente pasado a Field.
Cada vez que el editor de código pierde el foco, el valor se establece en "" y se muestran dos puntos dentro del editor ace.

Mi código es como jschlieber en el número original propuesto, eche un vistazo:

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

y

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

justo antes del botón puse un comentario ahora, // if I put it here, then it suddenly works fine <ReduxAce/> - así que sí, si pongo el Ace Editor como no es un componente de campo, entonces su valor no se borra. Como puede ver, traté de usar el controlador onBlur y preservar el valor, pero no pude.

¡Gracias por cualquier sugerencia!

awaiting response

Comentario más útil

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

funciona bien para mi

Todos 6 comentarios

Tengo el mismo problema. No veo el problema con la versión 5.1.1 , pero en 5.8.0 es un problema. Actualizaré si puedo resolverlo.

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

funciona bien para mi

@drewen @spoonscen - ¿

@avalkowsky - ¿ funciona la sugerencia de

@drewen ¡Te daré algunos detalles mañana!

@JFF , lo siento, que haya tardado tanto, la

¡Tu solución está funcionando!

@drewen gracias, me perdí eso 👍

@ taylordowns2000

También bajé react-ace a 5.1.1 y lo probé sin la devolución de llamada de onBlur, pero no funcionaba.
Tal vez cometí otro error, sin embargo, si fuera un desarrollador del futuro que tuviera este problema, usaría la solución JFFbys :)

¡Gracias a todos por la ayuda!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Bobcui001 picture Bobcui001  ·  5Comentarios

nenadlukic picture nenadlukic  ·  6Comentarios

anderoonies picture anderoonies  ·  5Comentarios

dmavrin picture dmavrin  ·  3Comentarios

Yuanye picture Yuanye  ·  7Comentarios