Jika Anda meneruskan fungsi prop ke react-ace, itu hanya akan mengikat fungsi pada dudukan AceEditor. Jika fungsi prop Anda berubah, itu tidak akan menggunakan fungsi baru Anda yang diubah, hanya yang diteruskan saat pemasangan pertama.
Detail masalahnya di sini, termasuk solusi yang mungkin.
Kemajuan pada: #
Saya mengalami masalah ini dan mengatasinya dengan mendapatkan nilai dari Editor
yang diteruskan ke perintah menggunakan getValue()
.
Jadi dalam kasus Anda, Anda akan mengubah fungsi handleSubmit
.
const handleSubmit = (editor) => {
const text = editor.getValue();
window.alert("You submitted the text: " + text);
};
Terima kasih atas solusinya! Itu adalah solusi sementara yang layak, tetapi masih belum menyelesaikan masalah root. Anda tidak boleh dipaksa untuk meneruskan seluruh objek editor ke induknya. Komponen Ace Editor seharusnya tidak hanya mengikat perintah Anda saat pemasangan. Jika Anda mengubah perintah yang diteruskan, itu harus memperbarui komponen dengan perintah yang diperbarui.
Solusi saat ini dalam komponen fungsi adalah menggunakan useRef
dan menetapkan () => referencedFunction.current()
sebagai gantinya exec
@ FMS-Cat bagaimana Anda mendapatkan ini bekerja? Menggunakan contoh berikut yang saya coba, sepertinya tidak berfungsi sebagai solusi?
function Example() {
function save() { ... }
const ref = useRef(save)
return (
<AceEditor commands={[
{
name: 'save',
bindKey: {
win: 'Ctrl-enter',
mac: 'Cmd-enter',
},
exec: () => ref.current(),
},
]}/>
)
}
Sampai ini diperbaiki, berikut lebih banyak kode untuk dua solusi yang dibahas di atas
// `onSave` shouldn't have to pass the content
// back up the chain since onChange already did that,
// hence calling this a workaround.
function Example({ content, onChange, onSave }) {
return (
<AceEditor
content={content}
onChange={c => onChange(c)}
commands={[{
name: 'save',
bindKey: { win: 'Ctrl-enter', mac: 'Cmd-enter' },
exec: editor => onSave(editor.getValue()),
}]}
/>
);
}
function Example({ content, onChange, onSave }) {
const editor = useRef(null)
return (
<AceEditor
ref={editor}
content={content}
onChange={c => onChange(c)}
commands={[{
name: 'save',
bindKey: { win: 'Ctrl-enter', mac: 'Cmd-enter' },
exec: () => onSave(editor.current.props.value),
}]}
/>
);
}
Komentar yang paling membantu
@ FMS-Cat bagaimana Anda mendapatkan ini bekerja? Menggunakan contoh berikut yang saya coba, sepertinya tidak berfungsi sebagai solusi?