Jak ręcznie wywołać zdarzenie kliknięcia w ReactJS ? Gdy użytkownik kliknie element1, chcę automatycznie wywołać kliknięcie input
tagu.
<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>
input
elemencie, co jest prawdopodobnie tym, co pytający chce osiągnąć za pomocą kliknięcia wyzwalanego programowo.Odpowiedzi:
Możesz użyć właściwości,
ref
aby uzyskać odwołanie do bazowego obiektu HTMLInputElement za pomocą wywołania zwrotnego, zapisać odwołanie jako właściwość klasy, a następnie użyć tego odwołania, aby później wywołać kliknięcie ze swoich programów obsługi zdarzeń za pomocą HTMLElement.click metody .W Twojej
render
metodzie:<input ref={input => this.inputElement = input} ... />
W programie obsługi zdarzeń:
this.inputElement.click();
Pełny przykład:
class MyComponent extends React.Component { render() { return ( <div onClick={this.handleClick}> <input ref={input => this.inputElement = input} /> </div> ); } handleClick = (e) => { this.inputElement.click(); } }
Zwróć uwagę na funkcję strzałki ES6, która zapewnia prawidłowy zakres leksykalny
this
w wywołaniu zwrotnym. Zauważ również, że obiekt, który zdobędziesz w ten sposób, jest obiektem podobnym do tego, co byś uzyskał używającdocument.getElementById
, tj. Rzeczywisty węzeł DOM.źródło
click
goclick
wywołuję , jest niezdefiniowany. Widzę wszystkie inne atrybuty i wywołania zwrotne, które przypisałem do tego elementu. Jakieś pomysły?ref={(ref)=>{this.fileUploadRef = ref}
a następnie w moim przyciskuonClick={()=>{this.fileUploadRef.click()}}
Do pracy w maju 2018 r. Z ES6 React Docs jako odniesieniem: 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;
źródło
Możesz użyć funkcji
ref
zwrotnej, która zwróci pliknode
. Wywołajclick()
ten węzeł, aby wykonać programowe kliknięcie.Pobieranie
div
węzłaclickDiv(el) { el.click() }
Ustawienie a
ref
dodiv
węzła<div id="element1" className="content" ref={this.clickDiv} onClick={this.uploadLogoIcon} >
Sprawdź skrzypce
https://jsfiddle.net/pranesh_ravi/5skk51ap/1/
Mam nadzieję, że to pomoże!
źródło
ref={elem => this.elem = elem}
- Jest to szczegółowo opisane w Refs to Components .el
nie jest null / undefined, zanim to zrobisz.W komponencie funkcjonalnym ta zasada również działa, to tylko trochę inna składnia i sposób myślenia.
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> </> ) }
źródło
Oto rozwiązanie hooków
import React, {useRef} from 'react'; const MyComponent = () =>{ const myRefname= useRef(null); const handleClick = () => { myRefname.current.focus(); } return ( <div onClick={handleClick}> <input ref={myRefname}/> </div> ); }
źródło
Spróbuj tego i daj mi znać, jeśli to nie zadziała:
<input type="checkbox" name='agree' ref={input => this.inputElement = input}/> <div onClick={() => this.inputElement.click()}>Click</div>
Kliknięcie na
div
powinno symulować kliknięcieinput
elementuźródło
Używanie haków React i
useRef
hooka .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> ); }
źródło
Riffowanie odpowiedzi Aarona Hakali za pomocą useRef zainspirowane tą odpowiedzią 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, }), ); };
I twój JSX:
<button onClick={() => clickElement(myRef)}>Click<button/> <input ref={myRef}>
źródło
Jeśli to nie działa w najnowszej wersji reagjs, spróbuj użyć innerRef
class MyComponent extends React.Component { render() { return ( <div onClick={this.handleClick}> <input innerRef={input => this.inputElement = input} /> </div> ); } handleClick = (e) => { this.inputElement.click(); } }
źródło
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>
Ta praca dla mnie
źródło
A może zwykły stary js? przykład:
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> );
źródło