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!
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!
Comentario más útil
funciona bien para mi