dispatch
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ onChange
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рди рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред
this.editor.value
рд╢реВрдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд рди рдХрд░реЗрдВред
рд╕рдВрд╕реНрдХрд░рдг: 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>
);
}
}
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
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
рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ 'рдЗрдиреНрд╕рд░реНрдЯ' рдХреЙрд▓ рдХреЗ рдмрд╛рдж 'рдбрд┐рд▓реАрдЯ' рдПрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЖрдк рдЗрд╕реЗ 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>
);
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рд╛рдЬреНрдп рдореВрд▓реНрдп рдХреЛ
value
рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред