React-ace: Redux์˜ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์‚ฌ์šฉํ•  ๋•Œ ๊ฐ’์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 01์›” 10์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: securingsincity/react-ace

๋•Œ ์‚ฌ์šฉ dispatch ์— ๊ธฐ๋Šฅ์„ onChange ๊ธฐ๋Šฅ์˜ ๊ฐ€์น˜๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

this.editor.value ๋Š” null์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์•„๋ฌด ๊ฒƒ๋„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „: 3.0.0

๋ฐ๋ชจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ œ ๊ฒฝ์šฐ์—๋Š” ์ƒํƒœ ๊ฐ’์„ value ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

๋ชจ๋“  7 ๋Œ“๊ธ€

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

@์›์˜ˆ

์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ

connect(
  mapDispatchToProps
)(Editor)

ํ•ด์•ผํ•œ๋‹ค

connect(
  null,
  mapDispatchToProps
)(Editor)

๋‘ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” mapStateToProps ๋ฐ mapDispatchToProps ํ•จ์ˆ˜ ๊ตฌํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค.

@chentsulin

๋‘ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” 'mapDispatchToProps'๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์‚ญ์ œ componentWillReceiveProps ํ•จ์ˆ˜ https://github.com/securingsincity/react-ace/blob/master/src/ace.jsx , ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 'insert' ํ˜ธ์ถœ ํ›„ 'delete' ์ž‘์—…์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. componentWillReceiveProps ํ•จ์ˆ˜์˜ console.log(nextProps)์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋””์ŠคํŒจ์น˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์žก์ง€ ๋ชปํ•œ๋‹ค. delete ๋ฐ insert ์ž‘์—…์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

@chentsulin ace.jsx ๋ฅผ ๋‚ด ํ”„๋กœ์ ํŠธ์— ๋ณต์‚ฌํ•˜๊ณ  ReactAce.componentWillReceiveProps์˜ console.log(nextProps)๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚˜์—๊ฒŒ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค

์ œ ๊ฒฝ์šฐ์—๋Š” ์ƒํƒœ ๊ฐ’์„ value ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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>
);
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰