React-ace: não funciona bem com redux-form

Criado em 28 jun. 2016  ·  3Comentários  ·  Fonte: securingsincity/react-ace

Quando usado com redux-form , e onChange despacha uma ação de "alteração", isso faz com que o AceEditor seja renderizado novamente e coloque o cursor no final do editor.

Todos 3 comentários

@ venil7 você conseguiu integrar um editor ACE em um formato redux?
Eu tenho que fazer exatamente a mesma coisa, você poderia fornecer algum exemplo de código por favor?

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

e depois use:

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)

É tão simples quanto isso e funciona muito bem!

Eu tenho um problema semelhante agora.

Estou usando o react-ace dentro do redux-form, como um componente passado para o Field - assim como acima.
Sempre que o editor perde o foco, o valor é definido como "" e os pontos são exibidos dentro do editor ace.

Meu código é igualzinho ao proposto pelo jschlieber, dê uma olhada:

`importar React de 'reagir'
importar AceEditor de 'react-ace'
import _ de 'lodash';

import 'chave/modo/javascript';
import 'chave/tema/monokai';

export função padrão 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}
    />
)

}`

e

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

const ID = 'id123', NOME = 'nome123', SOME_CODE = 'código123';

function mapStateToProps({draft}) {
Retorna {
rascunho
};
}

function mapDispatchToProps(dispatch) {
return bindActionCreators({
salvarRascunho
}, Despacho)
}

class Rascunho estende Componente {

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({
validar,
formulário: 'Rascunho de formulário'
})(
connect(mapStateToProps, mapDispatchToProps)(Rascunho)
)`

logo antes do botão eu coloquei um comentário agora, " // se eu colocar aqui, de repente funciona bem " - então sim, se eu colocar o Ace Editor como não é como componente Field, então seu valor não é deletado. Como você pode ver, tentei usar o handler onBlur e preservar o valor, mas não consegui.

Obrigado por quaisquer dicas!

Esta página foi útil?
0 / 5 - 0 avaliações