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

IT技术 html reactjs
2021-04-05 08:05:45

如何在ReactJS 中手动触发点击事件当用户点击 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>
6个回答

您可以使用refprop通过回调获取对底层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 节点。

这对我不起作用。不确定它是否过时,但我成功分配了元素,但是当我调用click它时,它click是未定义的。我可以看到分配给该元素的所有其他属性和回调。有任何想法吗?
2021-05-28 08:05:45
“Refs 不再返回文档 DOM 节点,它们返回对 React 虚拟 DOM 节点的引用”这绝对是一种误解。Refs 不会返回“虚拟 DOM”节点。资料来源:我在 React 工作。
2021-06-03 08:05:45
@TheJKFever 如果您使用的是 TypeScript,则单击可能未定义,因为输入是类型;HTMLInputElement | null;, 因此使用:onClick={() => { if(inputElement) (inputElement).click(); } }让它编译!
2021-06-06 08:05:45
@JohnWeisz 非常感谢,它对我有用,我有必要在 Form 之外处理单击,因为我不得不在按钮和表单之间放置一些元素。
2021-06-08 08:05:45
@DanAbramov 那么推荐的方法是什么?
2021-06-09 08:05:45

在 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 的答案。
2021-06-12 08:05:45

这是 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 不是函数”
2021-06-01 08:05:45

您可以使用ref回调,它将返回node. 调用click()该节点以进行编程点击。

获取div节点

clickDiv(el) {
  el.click()
}

refdiv节点设置a

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

检查小提琴

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

希望能帮助到你!

@JohnWhite 有效的建议。更新了答案!
2021-05-23 08:05:45
值得注意的是,虽然 string ref 方法没有被弃用,但它被认为是被基于回调的语法取代的遗留功能:ref={elem => this.elem = elem}- 这在Refs to Components 中有详细说明
2021-05-24 08:05:45
此外,el在执行此操作之前,您需要检查并确保不是空/未定义。
2021-06-14 08:05:45
当您链接到 jsfiddle 时,至少将相关代码放在此处是一个很好的做法(顺便说一句:代码段编辑器也支持 reactjs)
2021-06-19 08:05:45

在函数式组件中,这个原则也适用,只是语法和思维方式略有不同。

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

}