ฉันจะเข้าถึงสถานะโฮเวอร์ใน reactjs ได้อย่างไร


102

ฉันมี sidenav กับทีมบาสเก็ตบอลมากมาย ดังนั้นฉันจึงอยากจะแสดงสิ่งที่แตกต่างออกไปสำหรับแต่ละทีมเมื่อหนึ่งในนั้นถูกเลื่อน นอกจากนี้ฉันกำลังใช้ Reactjs ดังนั้นหากฉันมีตัวแปรที่ฉันสามารถส่งผ่านไปยังองค์ประกอบอื่นที่น่ากลัว


เป็นไปได้ที่จะซ้ำกันของปุ่มเลื่อนใน react.js
BentOnCoding

คำตอบ:


166

คอมโพเนนต์การตอบสนองจะแสดงเหตุการณ์ของเมาส์ Javascript มาตรฐานทั้งหมดในอินเทอร์เฟซระดับบนสุด แน่นอนคุณยังสามารถใช้:hoverใน CSS ของคุณได้และนั่นอาจเพียงพอสำหรับความต้องการบางอย่างของคุณ แต่สำหรับพฤติกรรมขั้นสูงที่เกิดจากการวางเมาส์คุณจะต้องใช้ Javascript ดังนั้นเพื่อจัดการปฏิสัมพันธ์โฉบคุณจะต้องการใช้และonMouseEnter onMouseLeaveจากนั้นคุณแนบเข้ากับตัวจัดการในส่วนประกอบของคุณดังนี้:

<ReactComponent
    onMouseEnter={() => this.someHandler}
    onMouseLeave={() => this.someOtherHandler}
/>

จากนั้นคุณจะใช้การรวมกันของสถานะ / อุปกรณ์ประกอบฉากเพื่อส่งต่อสถานะหรือคุณสมบัติที่เปลี่ยนแปลงไปยังองค์ประกอบปฏิกิริยาลูกของคุณ


โอเคฉันคิดว่าจะได้ผล ให้ฉันทดสอบดู นอกจากนี้ฉันจะส่งตัวแปรนี้ไปยังส่วนประกอบอื่น / ไม่ได้เชื่อมต่อได้อย่างไร
ชื่อผู้ใช้

1
นั่นเป็นเรื่องยุ่งยากจริง ๆ React ไม่ได้ให้ไว้อย่างแน่นอน ในสถาปัตยกรรมของเว็บแอปที่เลือกใช้วิธีการสื่อสารแบบ over-arching ทั่วโลก หลายคนคงเลือกโซลูชันประเภท event-bus ซึ่ง global event manager บางคนโพสต์และรับเหตุการณ์ในส่วนประกอบที่แตกต่างกัน ข้อความเหตุการณ์เหล่านี้จะมีข้อมูลที่คุณต้องการส่งผ่านเป็นอาร์กิวเมนต์ นี่คือสิ่งที่ Facebook แนะนำในเอกสารของพวกเขาในหัวข้อ: facebook.github.io/react/tips/…
stolli

2
สิ่งหนึ่งที่ฉันต้องการเพิ่มคือonMouseEnter onMouseLeaveเหตุการณ์ DOM พวกเขาจะไม่ทำงานแบบกำหนดเองReactComponentคุณจะต้องส่งต่อเหตุการณ์ลงไปเป็นเสาและผูกเหตุการณ์เหล่านี้เข้ากับองค์ประกอบ DOM ในนั้นReactComponentเช่น<div onMouseOver={ () => this.props.onMouseOver }>
DAMIEN JIANG

32

ReactJs กำหนดเหตุการณ์สังเคราะห์ต่อไปนี้สำหรับเหตุการณ์ของเมาส์:

onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp

อย่างที่คุณเห็นไม่มีเหตุการณ์โฮเวอร์เนื่องจากเบราว์เซอร์ไม่ได้กำหนดเหตุการณ์โฮเวอร์โดยกำเนิด

คุณจะต้องเพิ่มตัวจัดการสำหรับ onMouseEnter และ onMouseLeave สำหรับลักษณะการทำงานของโฮเวอร์

ReactJS Docs - เหตุการณ์


1

ฉันรู้ว่าคำตอบที่ได้รับการยอมรับเป็นที่ดี แต่สำหรับใครที่กำลังมองหาโฉบรู้สึกเหมือนคุณสามารถใช้setTimeoutบนmouseoverและบันทึกจับในแผนที่ (จาก Let 's รหัสรายการพูดเพื่อ setTimeout จับ) เมื่อmouseoverล้างที่จับจาก setTimeout และลบออกจากแผนที่

onMouseOver={() => this.onMouseOver(someId)}
onMouseOut={() => this.onMouseOut(someId)

และดำเนินการตามแผนที่ดังนี้:

onMouseOver(listId: string) {
  this.setState({
    ... // whatever
  });

  const handle = setTimeout(() => {
    scrollPreviewToComponentId(listId);
  }, 1000); // Replace 1000ms with any time you feel is good enough for your hover action
  this.hoverHandleMap[listId] = handle;
}

onMouseOut(listId: string) {
  this.setState({
    ... // whatever
  });

  const handle = this.hoverHandleMap[listId];
  clearTimeout(handle);
  delete this.hoverHandleMap[listId];
}

และแผนที่ก็เป็นเช่นนั้น

hoverHandleMap: { [listId: string]: NodeJS.Timeout } = {};

ฉันชอบonMouseOverและonMouseOutเพราะมันยังใช้ได้กับเด็กทุกคนในไฟล์HTMLElement. หากไม่จำเป็นต้องใช้คุณสามารถใช้onMouseEnterและonMouseLeaveตามลำดับ


0

หากต้องการมีเอฟเฟกต์โฮเวอร์คุณสามารถลองใช้รหัสนี้

import React from "react";
  import "./styles.css";

    export default function App() {

      function MouseOver(event) {
        event.target.style.background = 'red';
      }
      function MouseOut(event){
        event.target.style.background="";
      }
      return (
        <div className="App">
          <button onMouseOver={MouseOver} onMouseOut={MouseOut}>Hover over me!</button>
        </div>
      );
    }

หรือถ้าคุณต้องการจัดการกับสถานการณ์นี้โดยใช้ useState () hook คุณสามารถลองใช้โค้ดนี้ได้

import React from "react";
import "./styles.css";


export default function App() {
   let [over,setOver]=React.useState(false);

   let buttonstyle={
    backgroundColor:''
  }

  if(over){
    buttonstyle.backgroundColor="green";
  }
  else{
    buttonstyle.backgroundColor='';
  }

  return (
    <div className="App">
      <button style={buttonstyle}
      onMouseOver={()=>setOver(true)} 
      onMouseOut={()=>setOver(false)}
      >Hover over me!</button>
    </div>
  );
}

โค้ดทั้งสองข้างบนนี้จะใช้งานได้กับ hover effect แต่ขั้นตอนแรกจะเขียนและเข้าใจได้ง่ายกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.