React-ace: L'éditeur Ace ne lie que les commandes au montage

Créé le 12 août 2019  ·  5Commentaires  ·  Source: securingsincity/react-ace

Problème

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.

Exemple de code pour reproduire votre problème

(Ignorez l'erreur)
Edit relaxed-goldwasser-qprrd

Les références

Progrès sur: #

Documentation bug question

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?

function Example() {
    function save() { ... }

    const ref = useRef(save)

    return (
      <AceEditor commands={[
        {
          name: 'save',
          bindKey: {
            win: 'Ctrl-enter',
            mac: 'Cmd-enter',
          },
          exec: () => ref.current(),
        },
      ]}/>
    )
}

Tous les 5 commentaires

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

https://codesandbox.io/s/confident-neumann-99zmk

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

editor.getValue () [solution de contournement plus propre]

// `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()),
      }]}
    />
  );
}

useRef

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),
      }]}
    />
  );
}
Cette page vous a été utile?
0 / 5 - 0 notes