React-ace: Kann keinen erwarteten Wert erhalten, wenn der Versand von Redux verwendet wird

Erstellt am 10. Jan. 2016  ·  7Kommentare  ·  Quelle: securingsincity/react-ace

Wenn Sie die Funktion dispatch Funktion onChange verwenden, wird nicht der erwartete Wert angezeigt.

this.editor.value ist null, also hier nichts.

Version: 3.0.0

Hier ist die Demo:

import React from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import brace from 'brace';
import AceEditor from 'react-ace';

import 'brace/mode/sql';
import 'brace/mode/python';
import 'brace/theme/github';

// ActionCreators
export function onChangeAction(value) {
  // use `console.log(value)`  will not get the right expect value, an input print a letter.
  return {
    type: 'ON_CHANGE',
   text: value,
  }
};

// Editor Component
class Editor extends React.Component {
  constructor(props) {
    super(props);
  };

  render() {
    const { onChange } = this.props;
    return (
      <AceEditor
        mode="sql"
        theme="github"
        onChange={onChange}
        name="UNIQUE_ID_OF_DIV"
        width='100%'
        ref='editor'
        fontSize={15}
        editorProps={{$blockScrolling: true}}
      />
    );
  }
}


function mapDispatchToProps(dispatch) {
  return {onChange: bindActionCreators(onChangeAction, dispatch)};
};


connect(
  mapDispatchToProps
)(Editor)

// App
import { Provider } from 'react-redux';


class App extends React.Component {
  render() {
    const { store } = this.props;
    return (
      <Provider store={store}>
         <Editor />
      </Provider>
    );
  }
}

Hilfreichster Kommentar

Setzen Sie in meinem Fall den value Option

const TextArea = (props) => (
  <div className={styles.box}>
    <AceEditor
      mode="javascript"
      theme="solarized_light"
      onChange={props.onChange}
      name="RIGHT_INPUT"
      width="100%"
      height="100%"
      value={props.value}
      showPrintMargin={false}
      editorProps={{ $blockScrolling: true }}
    />
  </div>
);

Alle 7 Kommentare

Funktioniert so nicht:

import React from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import brace from 'brace';
import AceEditor from 'react-ace';

import 'brace/mode/sql';
import 'brace/mode/python';
import 'brace/theme/github';

// `onChangeAction` from ActionCreators
export function onChangeAction(text) {
  return {
    type: 'ON_CHANGE',
    statement: text,
  }
};


class Editor extends React.Component {
  constructor(props) {
    super(props);
  };
  onChange = (value) => {
    console.log(value);
    const { dispatch } = this.props;
    dispatch(onChangeAction(value));
  };
  render() {

    return (
      <AceEditor
        mode="sql"
        theme="github"
        onChange={this.onChange}
        name="UNIQUE_ID_OF_DIV"
        width='100%'
        ref='editor'
        fontSize={15}
        editorProps={{$blockScrolling: true}}
      />
    );
  }
}



connect(
  mapStateToProps,
  mapDispatchToProps
)(Editor)


class App extends React.Component {
  render() {
    const { store } = this.props;
    return (
      <Provider store={store}>
         <Editor  />
      </Provider>
    );
  }
}

@Yuanye

In deinem ersten Beispiel

connect(
  mapDispatchToProps
)(Editor)

sollte sein

connect(
  null,
  mapDispatchToProps
)(Editor)

In Ihrem zweiten Beispiel haben Sie keine Implementierung der Funktion mapStateToProps und mapDispatchToProps.

@chentsulin

Benötigt 'mapDispatchToProps' im zweiten Beispiel nicht.

const mapStateToProps = (state) => {
  return {
    query: getQuery(state),
  }
};

Ich lösche die componentWillReceiveProps Funktion in https://github.com/securingsincity/react-ace/blob/master/src/ace.jsx und es funktioniert.

Wenn dies nicht der Fall ist, wird nach dem Aufruf von 'insert' die Aktion 'delete' aufgerufen. Sie finden es unter console.log(nextProps) in der Funktion componentWillReceiveProps .

Natürlich wird der Versand standardmäßig als Requisite weitergegeben.

Ich versteh das nicht. Wo sind die Aktionen delete und insert ?

@chentsulin Ich habe ace.jsx in mein eigenes Projekt kopiert und console.log(nextProps) in ReactAce.componentWillReceiveProps.

schaut sich das jemand an?
Das ist immer noch ein Thema für mich

Setzen Sie in meinem Fall den value Option

const TextArea = (props) => (
  <div className={styles.box}>
    <AceEditor
      mode="javascript"
      theme="solarized_light"
      onChange={props.onChange}
      name="RIGHT_INPUT"
      width="100%"
      height="100%"
      value={props.value}
      showPrintMargin={false}
      editorProps={{ $blockScrolling: true }}
    />
  </div>
);
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Jarmahent picture Jarmahent  ·  3Kommentare

huangjiatian picture huangjiatian  ·  7Kommentare

avalkowsky picture avalkowsky  ·  6Kommentare

ghiden picture ghiden  ·  3Kommentare

dmavrin picture dmavrin  ·  3Kommentare