Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk membolehkan komponen React merekodkan pembolehubah klik kanan, yang memerlukan klik dua kali untuk mencapainya

<p>Saya menghadapi masalah dengan komponen React dalam projek saya di mana saya perlu mengklik dua kali semasa navigasi untuk merekodkan pembolehubah dengan betul untuk klik kanan. Berikut ialah butiran masalah dan kod saya: </p> <p>Saya mempunyai komponen React yang mewakili sistem navigasi kursus. Apabila saya mengklik pada kursus dalam menu navigasi, ia harus merekodkan indeks kursus yang diklik dan memulakan beberapa tindakan. Walau bagaimanapun, saya perasan bahawa saya perlu mengklik dua kali untuk mendapatkan indeks untuk direkod dengan betul. </p> <p>Di dalam komponen, terdapat fungsi yang dipanggil handleOtp, yang mengendalikan logik untuk memulakan main balik video dan menetapkan OTP akses video. Masalahnya nampaknya berpunca daripada fungsi ini. </p> <p>Berikut ialah gambaran keseluruhan ringkas fungsi handleOtp: </p> <pre class="lang-js prettyprint-override"><code>const handleOtp = async () => cuba { const lessonId = kursus.pelajaran[diklik]?.video?.id; // Ini adalah kawasan masalah const { data } = tunggu axios.post("/api/videoOtp", { videoId: lessonId, nama pengguna: pengguna.nama pengguna, ip, }); jika (!data.otp && !data.playbackInfo) { return toast.error("OTP Video gagal! Muat semula halaman"); } muatVideo({ otp: data.otp, playbackInfo: data.playbackInfo, konfigurasi: { automain: benar, }, bekas: container.current, }); } tangkap (err) { console.error(err); } }; </code></pre> <p>Menurut pemerhatian saya, klik pertama mencetuskan fungsi handleOtp, tetapi indeks klik itu salah, mengakibatkan tingkah laku yang tidak dijangka. Klik kedua akhirnya merekodkan indeks klik yang betul dan berfungsi seperti yang diharapkan. </p> <p>Saya telah memastikan tiada kemas kini status tak segerak yang boleh menyebabkan masalah. Saya mengesyaki mungkin terdapat masalah masa atau pengurusan keadaan yang menyebabkan tingkah laku ini, tetapi saya menghadapi kesukaran untuk menentukan punca sebenar. </p> <p>Saya ingin dapat memahami sebab tingkah laku klik dua kali ini berlaku dan cara memastikan indeks klik yang betul direkodkan pada klik pertama. Sebarang pandangan atau cadangan akan sangat dihargai.谢谢!</p> <p>我的React组件:</p> <pre class="brush:php;toolbar:false;"><StudentRoute> <div className="row mt-2"> <div className="lessons-menu"> <Menu defaultSelectedKeys={[diklik]} inlineCollapsed={collapsed} gaya={{ ketinggian: "100%" }} > {course.lessons.map((pelajaran, indeks) => ( <Item onClick={async () => { setClicked(indeks); setIsLoading(true); setSpin(benar); setCheckoutVisibility("tiada"); checkTransactionStatus(index); setPaymentMethod("kiosk"); setKioskPhoneNumber(""); handleOtp(); }} kunci={indeks} icon={<Avatar>{index + 1}</Avatar>} ></pra> <p>尝试使用console.log记录diklik变量:</p>
P粉083785014P粉083785014403 hari yang lalu498

membalas semua(1)saya akan balas

  • P粉821231319

    P粉8212313192023-08-16 16:58:48

    Ini kerana fungsi setState是异步执行的。你在OnClick事件中设置了clicked,然后调用了handleOtp. Dalam kes ini, keadaan belum dikemas kini lagi, jadi anda mendapat indeks yang salah pada klik pertama.

    Anda hanya perlu index作为参数传递给handleOtp。不再需要setClicked.

    const handleOtp = async (index) => {}
    
    <StudentRoute>
        <div className="row mt-2">
          <div className="lessons-menu">
            <Menu
              defaultSelectedKeys={[clicked]}
              inlineCollapsed={collapsed}
              style={{ height: "100%" }}
            >
              {course.lessons.map((lesson, index) => (
                <Item
                  onClick={async () => {
                    setIsLoading(true);
                    setSpin(true);
                    setCheckoutVisibility("none");
                    checkTransactionStatus(index);
                    setPaymentMethod("kiosk");
                    setKioskPhoneNumber("");
                    handleOtp(index);
                  }}
                  
                  key={index}
                  icon={<Avatar>{index + 1}</Avatar>}
                />
              ))}
            <Menu/>
          </div>
        </div>
    <StudentRoute/>

    balas
    0
  • Batalbalas