Si vous passez une fonction prop à react-ace, elle ne liera la fonction qu'au niveau du montage AceEditor. Si votre accessoire de fonction change, il n'utilisera pas votre nouvelle fonction modifiée, seulement celle transmise lors du premier montage.
Détaillez le problème ici, y compris les solutions possibles.
Progrès sur: #
Je suis tombé sur ce problème et l'ai contourné en obtenant la valeur de Editor
qui est passée à la commande en utilisant getValue()
.
Donc, dans votre cas, vous changeriez la fonction handleSubmit
.
const handleSubmit = (editor) => {
const text = editor.getValue();
window.alert("You submitted the text: " + text);
};
Merci pour la solution de contournement! C'est une solution temporaire décente, mais elle ne résout toujours pas le problème racine. Vous ne devriez pas être obligé de transmettre l'ensemble de l'objet éditeur au parent. Le composant Ace Editor ne doit pas uniquement lier vos commandes lors du montage. Si vous modifiez les commandes transmises, il doit mettre à jour le composant avec vos commandes mises à jour.
La solution de contournement actuelle dans les composants de fonction consiste à utiliser useRef
et à affecter le () => referencedFunction.current()
place comme exec
@ FMS-Cat comment avez-vous fait fonctionner cela? En utilisant l'exemple suivant que j'ai essayé, cela ne semble pas fonctionner comme une solution?
function Example() {
function save() { ... }
const ref = useRef(save)
return (
<AceEditor commands={[
{
name: 'save',
bindKey: {
win: 'Ctrl-enter',
mac: 'Cmd-enter',
},
exec: () => ref.current(),
},
]}/>
)
}
Jusqu'à ce que cela soit résolu, voici plus de code pour deux solutions de contournement décrites ci-dessus
// `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),
}]}
/>
);
}
Commentaire le plus utile
@ FMS-Cat comment avez-vous fait fonctionner cela? En utilisant l'exemple suivant que j'ai essayé, cela ne semble pas fonctionner comme une solution?