Saat menggunakan fungsi dispatch
dalam fungsi onChange
, tidak akan mendapatkan nilai yang diharapkan.
this.editor.value
adalah nol, jadi jangan dapatkan apa pun di sini.
Versi: 3.0.0
Berikut demonya:
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>
);
}
}
Tidak bekerja dengan cara ini:
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
Dalam contoh pertama Anda
connect(
mapDispatchToProps
)(Editor)
seharusnya
connect(
null,
mapDispatchToProps
)(Editor)
Dalam contoh kedua, Anda tidak memiliki implementasi fungsi mapStateToProps dan mapDispatchToProps.
@chentsulin
Tidak perlu 'mapDispatchToProps' dalam contoh kedua.
const mapStateToProps = (state) => {
return {
query: getQuery(state),
}
};
Saya menghapus fungsi componentWillReceiveProps
di https://github.com/securingsincity/react-ace/blob/master/src/ace.jsx
, dan berfungsi.
Jika tidak, itu akan memanggil tindakan 'hapus' setelah panggilan 'masukkan' . Anda dapat menemukannya di console.log(nextProps) dalam fungsi componentWillReceiveProps
.
Tentu, pengiriman akan diturunkan sebagai alat peraga sebagai default.
Saya tidak menangkap ini. Di mana tindakan delete
dan insert
?
@chentsulin Saya menyalin ace.jsx
ke proyek saya sendiri, dan console.log(nextProps) di ReactAce.componentWillReceiveProps.
apakah ada yang melihatnya?
ini masih menjadi masalah bagi saya
Dalam kasus saya, setel nilai status ke opsi 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>
);
Komentar yang paling membantu
Dalam kasus saya, setel nilai status ke opsi
value
.