如何在ReactJS中手动触发点击事件?


97

如何在ReactJS中手动触发click事件?当用户单击element1时,我想自动触发对input标签的单击。

<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>

查看一些外部库,以编程方式制作输入元素似乎是个好主意:github.com/okonet/react-dropzone/blob/master/src/index.js#L7
Ahmed Nuaman

我看不到您为什么要在React中这样做。您想做什么?
tobiasandersen '16

@tobiasandersen这是一个完全有效的用例,可以以编程方式聚焦一个input元素,这可能是提问者希望通过编程触发的点击来完成的。
John Weisz

是的,可以肯定,聚焦和模糊都完全有效。但是点击?我问的原因是,例如,如果重点是用例,那么最好展示一下。但是,如果单击确实是用例,那么最好只调用处理程序。
tobiasandersen

@JohnWhite好吧,它可能被正确地绑定了:)但是,您可能是对的,摆脱狡猾不是我的意思。只想看看这背后的真正意图是什么。
tobiasandersen

Answers:


121

您可以使用该ref道具通过回调获取对基础HTMLInputElement对象的引用,将该引用存储为类属性,然后使用该引用稍后使用HTMLElement.click方法触发事件处理程序中的单击。

在您的render方法中:

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

在事件处理程序中:

this.inputElement.click();

完整示例:

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

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

请注意ES6箭头函数,该函数this回调提供正确的词法作用域。还要注意,以这种方式获取的对象类似于使用会获取的对象document.getElementById,即实际的DOM节点。


7
这对我不起作用。不知道它是否过期,但是我成功分配了元素,但是当我调用click它时,它click是不确定的。我可以看到分配给该元素的所有其他属性和回调。有任何想法吗?
TheJKFever's

40
“引用不再返回文档DOM节点,它们返回对React虚拟DOM节点的引用”这绝对是一种误解。引用不返回“虚拟DOM”节点。资料来源:我从事React。
Dan Abramov

4
@DanAbramov那么推荐的方法是什么?
仪表板

1
@JohnWeisz非常感谢,它对我有用,我有必要处理Form外部的单击,因为我必须在按钮和表单之间放置一些元素。
Markus Ethur '18

1
为我工作。我将输入元素放在绝对位置为-100的位置,然后在代码中输入,然后在ref={(ref)=>{this.fileUploadRef = ref}按钮中输入onClick={()=>{this.fileUploadRef.click()}}
Richard Richard

20

在2018年5月使用ES6 React Docs作为参考进行了以下操作: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;

这看起来更像是面向React的答案。
里蒂克

8

您可以使用ref回调函数来返回node。调用click()该节点以编程方式单击。

获取div节点

clickDiv(el) {
  el.click()
}

设置一refdiv节点

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

检查小提琴

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

希望能帮助到你!


当您链接到jsfiddle时,在这里至少放置相关代码是一种很好的做法(顺便说一句:代码段编辑器也支持reactjs)
Icepickle

4
值得注意的是,虽然不建议使用字符串引用方法,但是它被认为是基于回调的语法所取代的旧功能:ref={elem => this.elem = elem}-在Refs to Components中有详细介绍。
John Weisz

1
@JohnWhite有效的建议。更新了答案!
Pranesh Ravi

另外,el在执行此操作之前,您需要检查并确保其不为null / undefined。
janex

4

在功能组件中,该原理也适用,只是语法和思维方式略有不同。

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

试试这个,让我知道它是否对您不利:

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

单击div应模拟单击input元素


2

这是挂钩解决方案

    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不是函数”
Spoderman4

1

使用React Hooks和useRef钩子

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

对我来说,这是行不通的,因为单击和焦点不可用。但是, 如果不是尝试执行myInput.current?.click(),则此答案的工作原理是stackoverflow.com/a/54316368/3893510。您可以执行以下操作:myInput.current.dispatchEvent(new MouseEvent('click',{view:window,bubbles:true,cancelable:true,button:1,}),); 它应该可以工作
jackbridger

1

嘲讽亚伦·哈卡拉(Aaron Hakala)的答案参考此答案的启发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,
      }),
    );
  };

还有您的JSX:

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

0

如果在最新版本的reactjs中不起作用,请尝试使用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>

这对我有用


-2

普通的旧js怎么样?例:

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

期望在React中
Nitin Kumar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.