Làm cách nào để kích hoạt sự kiện nhấp chuột theo cách thủ công trong ReactJS?


97

Làm cách nào để kích hoạt sự kiện nhấp chuột trong ReactJS theo cách thủ công ? Khi người dùng nhấp vào phần tử1, tôi muốn tự động kích hoạt một lần nhấp vào inputthẻ.

<div className="div-margins logoContainer">
  <div id="element1" className="content" onClick={this.uploadLogoIcon}>
    <div className="logoBlank" />
  </div>
  <input accept="image/*" type="file" className="hide"/>
</div>

Nhìn vào một số thư viện bên ngoài, có vẻ như là một ý tưởng tốt để làm cho các yếu tố đầu vào lập trình: github.com/okonet/react-dropzone/blob/master/src/index.js#L7
Ahmed Nuaman

Tôi không thể hiểu tại sao bạn lại muốn làm điều này trong React. Bạn đang muốn làm gì?
tobiasandersen

@tobiasandersen Đây là một trường hợp sử dụng hoàn toàn hợp lệ để tập trung một inputphần tử theo chương trình , đây có thể là những gì người hỏi muốn đạt được với lần nhấp được kích hoạt theo chương trình.
John Weisz

Vâng chắc chắn, cả tiêu điểm và mờ đều hoàn toàn hợp lệ. Nhưng nhấp chuột? Lý do tôi hỏi là nếu ví dụ: lấy nét là trường hợp sử dụng, thì tốt hơn là hiển thị điều đó. Nhưng nếu nhấp chuột thực sự là trường hợp sử dụng, thì tốt hơn là chỉ cần gọi trình xử lý.
tobiasandersen

@JohnWhite Vâng, nó có thể được ràng buộc một cách chính xác :) Nhưng bạn có thể đúng, và tôi không có ý nói gì khi bắt bẻ. Chỉ muốn xem ý định thực sự đằng sau việc này là gì.
tobiasandersen

Câu trả lời:


121

Bạn có thể sử dụng phần mềm refhỗ trợ để có được một tham chiếu đến đối tượng HTMLInputElement bên dưới thông qua một lệnh gọi lại, lưu trữ tham chiếu dưới dạng thuộc tính lớp, sau đó sử dụng tham chiếu đó để kích hoạt một lần nhấp từ trình xử lý sự kiện của bạn bằng cách sử dụng HTMLElement.click phương thức .

Trong renderphương pháp của bạn :

<input ref={input => this.inputElement = input} ... />

Trong trình xử lý sự kiện của bạn:

this.inputElement.click();

Ví dụ đầy đủ:

class MyComponent extends React.Component {
  render() {
    return (
      <div onClick={this.handleClick}>
        <input ref={input => this.inputElement = input} />
      </div>
    );
  }

  handleClick = (e) => {
    this.inputElement.click();
  }
}

Lưu ý hàm mũi tên ES6 cung cấp phạm vi từ vựng chính xác cho thislệnh gọi lại. Cũng lưu ý rằng đối tượng mà bạn có được theo cách này là một đối tượng giống với những gì bạn sẽ có được bằng cách sử dụng document.getElementById, tức là nút DOM thực tế.


7
Điều này không làm việc cho tôi. Không chắc liệu nó có lỗi thời hay không, nhưng tôi đã gán thành công phần tử, nhưng khi tôi gọi clicknó, nó clicklà không xác định. Tôi có thể thấy tất cả các thuộc tính và lệnh gọi lại khác mà tôi đã gán cho phần tử đó. Có ý kiến ​​gì không?
TheJKFever

40
"Refs không còn trả về nút DOM của tài liệu nữa, chúng trả về tham chiếu đến nút DOM ảo của React" Đó chắc chắn là một quan niệm sai lầm. Refs không trả về các nút "DOM ảo". Nguồn: Tôi làm việc trên React.
Dan Abramov

4
@DanAbramov Vậy phương pháp được khuyến nghị cho việc này là gì?
bảng điều khiển

1
@JohnWeisz Cảm ơn bạn rất nhiều, nó có hiệu quả với tôi, tôi cần xử lý điều này với nhấp chuột bên ngoài Biểu mẫu vì tôi muốn đặt một số yếu tố giữa nút và biểu mẫu.
Markus Ethur

1
Làm việc cho tôi. Tôi đặt phần tử đầu vào ở -100 với vị trí tuyệt đối, sau đó trong mã của tôi ref={(ref)=>{this.fileUploadRef = ref}và sau đó là nút của tôionClick={()=>{this.fileUploadRef.click()}}
Richard

20

Có những thứ sau để hoạt động vào tháng 5 năm 2018 với Tài liệu React ES6 làm tài liệu tham khảo: https://reactjs.org/docs/refs-and-the-dom.html

import React, { Component } from "react";
class AddImage extends Component {
  constructor(props) {
    super(props);
    this.fileUpload = React.createRef();
    this.showFileUpload = this.showFileUpload.bind(this);
  }
  showFileUpload() {
    this.fileUpload.current.click();
  }
  render() {
    return (
      <div className="AddImage">
        <input
          type="file"
          id="my_file"
          style={{ display: "none" }}
          ref={this.fileUpload}
        />
        <input
          type="image"
          src="http://www.graphicssimplified.com/wp-content/uploads/2015/04/upload-cloud.png"
          width="30px"
          onClick={this.showFileUpload}
        />
      </div>
    );
  }
}
export default AddImage;

Đây có vẻ giống như câu trả lời Hướng phản ứng hơn .
Ritik

8

Bạn có thể sử dụng refcallback sẽ trả về node. Gọi click()vào nút đó để thực hiện một nhấp chuột có lập trình.

Bắt divnút

clickDiv(el) {
  el.click()
}

Đặt a refcho divnút

<div 
  id="element1"
  className="content"
  ref={this.clickDiv}
  onClick={this.uploadLogoIcon}
>

Kiểm tra fiddle

https://jsfiddle.net/pranesh_ravi/5skk51ap/1/

Hy vọng nó giúp!


khi bạn liên kết đến một jsfiddle, nó concidered một thực hành tốt để đặt ít nhất là mã có liên quan ở đây (btw: trình biên tập đoạn hỗ trợ reactjs cũng)
Icepickle

4
Điều đáng chú ý là mặc dù phương thức tham chiếu chuỗi không bị phản đối, nhưng nó được coi là chức năng kế thừa được thay thế bằng cú pháp dựa trên gọi lại: ref={elem => this.elem = elem}- Điều này được trình bày chi tiết trong Refs to Components .
John Weisz

1
@JohnWhite Đề xuất hợp lệ. Đã cập nhật câu trả lời!
Pranesh Ravi

Ngoài ra, bạn cần kiểm tra và đảm bảo rằng elnó không null / undefined trước khi làm điều đó.
janex

4

Trong một thành phần chức năng, nguyên tắc này cũng hoạt động, nó chỉ là một cú pháp và cách suy nghĩ hơi khác.

const UploadsWindow = () => {
  // will hold a reference for our real input file
  let inputFile = '';

  // function to trigger our input file click
  const uploadClick = e => {
    e.preventDefault();
    inputFile.click();
    return false;
  };

  return (
    <>
      <input
        type="file"
        name="fileUpload"
        ref={input => {
          // assigns a reference so we can trigger it later
          inputFile = input;
        }}
        multiple
      />

      <a href="#" className="btn" onClick={uploadClick}>
        Add or Drag Attachments Here
      </a>
    </>
  )

}

2

Hãy thử điều này và cho tôi biết nếu nó không hoạt động ở phía bạn:

<input type="checkbox" name='agree' ref={input => this.inputElement = input}/>
<div onClick={() => this.inputElement.click()}>Click</div>

Nhấp vào divsẽ mô phỏng một lần nhấp vào inputphần tử


2

Đây là giải pháp Hooks

    import React, {useRef} from 'react';

    const MyComponent = () =>{

    const myRefname= useRef(null);

    const handleClick = () => {
        myRefname.current.focus();
     }

    return (
      <div onClick={handleClick}>
        <input ref={myRefname}/>
      </div>
     );
    }

"myRefname.current.focus không phải là một hàm"
Spoderman4 Ngày

1

Sử dụng React Hooks và useRefhook .

import React, { useRef } from 'react';

const MyComponent = () => {
    const myInput = useRef(null);

    const clickElement = () => {
        // To simulate a user focusing an input you should use the
        // built in .focus() method.
        myInput.current?.focus();

        // To simulate a click on a button you can use the .click()
        // method.
        // myInput.current?.click();
    }

    return (
        <div>
            <button onClick={clickElement}>
                Trigger click inside input
            </button>
            <input ref={myInput} />
        </div>
    );
}

Đối với tôi, điều này không hoạt động vì không có nhấp chuột và tiêu điểm. Nhưng câu trả lời này có tác dụng gì, stackoverflow.com/a/54316368/3893510 nếu thay vì cố gắng thực hiện myInput.current? .Click (); Bạn thực hiện: myInput.current.dispatchEvent (new MouseEvent ('click', {view: window, bong bóng: true, hủy được: true, các nút: 1,}),); Nó sẽ hoạt động
jackbridger

1

Nghi ngờ câu trả lời của Aaron Hakala với useRef lấy cảm hứng từ câu trả lời này https://stackoverflow.com/a/54316368/3893510

const myRef = useRef(null);

  const clickElement = (ref) => {
    ref.current.dispatchEvent(
      new MouseEvent('click', {
        view: window,
        bubbles: true,
        cancelable: true,
        buttons: 1,
      }),
    );
  };

Và JSX của bạn:

<button onClick={() => clickElement(myRef)}>Click<button/>
<input ref={myRef}>

0

Nếu nó không hoạt động trong phiên bản mới nhất của reactjs, hãy thử sử dụng innerRef

class MyComponent extends React.Component {


  render() {
    return (
      <div onClick={this.handleClick}>
        <input innerRef={input => this.inputElement = input} />
      </div>
    );
  }

  handleClick = (e) => {
    this.inputElement.click();
  }
}

0

  imagePicker(){
        this.refs.fileUploader.click();
        this.setState({
            imagePicker: true
        })
    }
  <div onClick={this.imagePicker.bind(this)} >
  <input type='file'  style={{display: 'none'}}  ref="fileUploader" onChange={this.imageOnChange} /> 
  </div>

Công việc này cho tôi


-2

Làm thế nào về chỉ đơn giản js cũ? thí dụ:

autoClick = () => {
 if (something === something) {
    var link = document.getElementById('dashboard-link');
    link.click();
  }
};
  ......      
var clickIt = this.autoClick();            
return (
  <div>
     <Link id="dashboard-link" to={'/dashboard'}>Dashboard</Link>
  </div>
);

Expectaion đang ở trong React
Nitin Kumar,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.