Javascript 反应:单击html元素时仅执行一次操作

Javascript 反应:单击html元素时仅执行一次操作,javascript,reactjs,Javascript,Reactjs,在jQuery中,在html元素上触发事件时,只执行一次操作是非常简单的 例如: $(".dropdown-trigger").on("click", function(event) { var self = this; $("html").one("click", function() { $(self).parents(".dropdown").removeClass("active"); }); $(this).parents(".dropdown").toggle

在jQuery中,在
html
元素上触发事件时,只执行一次操作是非常简单的

例如:

$(".dropdown-trigger").on("click", function(event) {
  var self = this;
  $("html").one("click", function() {
    $(self).parents(".dropdown").removeClass("active");
  });
  $(this).parents(".dropdown").toggleClass("active");

  event.stopPropagation();
});
事实上,这并不容易


如何在单击html元素时在React中执行操作,并且仅执行一次该操作(类似于我的jQuery代码)?

翻转状态一旦元素触发其事件,React将重新呈现组件,因为您的状态已更改,并且不会显示该组件。下面是实现这一结果的一个例子

_onEvent() {
    this.setState({
        hasTriggered: true
    })
}


render() {
    return (
        <div>
            {
                !this.state.hasTriggered ?
                <MyElement onClick={this._onEvent.bind(this)} /> : null
            }
        </div>
    )
}
\u onEvent(){
这是我的国家({
哈斯:是的
})
}
render(){
返回(
{
!this.state.has已触发?
:null
}
)
}

翻转状态一旦元素触发其事件,react将重新呈现组件,因为您的状态已更改,并且不会显示该组件。下面是实现这一结果的一个例子

_onEvent() {
    this.setState({
        hasTriggered: true
    })
}


render() {
    return (
        <div>
            {
                !this.state.hasTriggered ?
                <MyElement onClick={this._onEvent.bind(this)} /> : null
            }
        </div>
    )
}
\u onEvent(){
这是我的国家({
哈斯:是的
})
}
render(){
返回(
{
!this.state.has已触发?
:null
}
)
}

使用参考文献。虽然不太好看,但至少效果不错。这需要反应>16.8

import React, { useEffect, useRef } from 'react'

const App = () => {
  const ref = useRef()

  // Wait for DOM to load
  useEffect(() => ref.addEventListener('click', () => alert('Hi'), { once: true })

  return <button ref={ref}>Click on me (once)</button>
}
import React,{useffect,useRef}来自“React”
常量应用=()=>{
const ref=useRef()
//等待DOM加载
useffect(()=>ref.addEventListener('click',()=>alert('Hi'),{once:true})
返回单击我(一次)
}

使用参考文献。虽然不太好看,但至少它可以工作。这需要React>16.8

import React, { useEffect, useRef } from 'react'

const App = () => {
  const ref = useRef()

  // Wait for DOM to load
  useEffect(() => ref.addEventListener('click', () => alert('Hi'), { once: true })

  return <button ref={ref}>Click on me (once)</button>
}
import React,{useffect,useRef}来自“React”
常量应用=()=>{
const ref=useRef()
//等待DOM加载
useffect(()=>ref.addEventListener('click',()=>alert('Hi'),{once:true})
返回单击我(一次)
}

带有useState,也用于React>16.8

import React, { useState } from 'react';

const App = () => {
  const [clicked, setClicked] = useState(false);
  const myFunc = () => alert('hey');
  const onClick = (event) => {
    if (!clicked) {
      setClicked(true);
      myFunc(event);
    }
  };
  return <button onClick={onClick}>Click on me (once)</button>;
};
import React,{useState}来自“React”;
常量应用=()=>{
const[clicked,setClicked]=useState(false);
常量myFunc=()=>警报('hey');
const onClick=(事件)=>{
如果(!单击){
setClicked(true);
myFunc(事件);
}
};
返回点击我(一次);
};

带有useState,也用于React>16.8

import React, { useState } from 'react';

const App = () => {
  const [clicked, setClicked] = useState(false);
  const myFunc = () => alert('hey');
  const onClick = (event) => {
    if (!clicked) {
      setClicked(true);
      myFunc(event);
    }
  };
  return <button onClick={onClick}>Click on me (once)</button>;
};
import React,{useState}来自“React”;
常量应用=()=>{
const[clicked,setClicked]=useState(false);
常量myFunc=()=>警报('hey');
const onClick=(事件)=>{
如果(!单击){
setClicked(true);
myFunc(事件);
}
};
返回点击我(一次);
};

可能重复的@JCOC611请再次阅读该问题;OP询问如何设置一个处理程序,该处理程序在被触发一次后自动解除绑定。OP,您可以使用状态标志执行此操作,但您的jQuery示例代码表明这是一个XY问题。我决不会使用
.one
来执行清除下拉列表之类的操作。@Mathletics谢谢。可以吗你给我举个例子?我很乐意回答你。同样,这是。请告诉我们你试图解决的问题和你想要实现的目标。你问的是如何实现一个特定的(我可能是无效的)解决方案。@JCOC611的可能副本请再次阅读该问题;OP询问如何设置一个处理程序,该处理程序在被触发一次后自动解除绑定。OP,您可以使用状态标志执行此操作,但您的jQuery示例代码表明这是一个XY问题。我决不会使用
.one
来执行清除下拉列表之类的操作。@Mathletics谢谢。C你能给我举个例子吗?我很乐意给你一个答案。同样,这是。请告诉我们你想解决什么问题以及你想实现什么。你问的是如何实施一个特定的解决方案(在我看来可能是无效的)。这对我帮助很大!谢谢你救了我一天!:)这对我帮助很大!谢谢你救了我一天!:)