React-ace: Editor Ace hanya mengikat perintah saat dipasang

Dibuat pada 12 Agu 2019  ·  5Komentar  ·  Sumber: securingsincity/react-ace

Masalah

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.

Kode contoh untuk mereproduksi masalah Anda

(Abaikan kesalahan)
Edit relaxed-goldwasser-qprrd

Referensi

Kemajuan pada: #

Documentation bug question

Komentar yang paling membantu

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

Semua 5 komentar

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

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

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

editor.getValue () [solusi bersih]

// `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),
      }]}
    />
  );
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

kolbinski picture kolbinski  ·  5Komentar

viridia picture viridia  ·  4Komentar

Bobcui001 picture Bobcui001  ·  5Komentar

tsmirnov picture tsmirnov  ·  4Komentar

huangjiatian picture huangjiatian  ·  7Komentar