Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据状态有条件地应用onClick侦听器_Javascript_Reactjs - Fatal编程技术网

Javascript 如何根据状态有条件地应用onClick侦听器

Javascript 如何根据状态有条件地应用onClick侦听器,javascript,reactjs,Javascript,Reactjs,如果我有这样的东西 const Component = () => { const [open, setOpen] = React.useReducer(open => !open, false) const doSomething = () => console.log('did something') return <div onClick={open && doSomething}></div> } 我知道我可以做

如果我有这样的东西

const Component = () => {
  const [open, setOpen] = React.useReducer(open => !open, false)

  const doSomething = () => console.log('did something')

  return <div onClick={open && doSomething}></div>
}
我知道我可以做这样的事情

<div onClick={open ? () => doSomething : null}></div>
doSomething:null}>

打开了吗?doSomething():null}>

但是我想知道是否有一种方法可以像第一个例子中那样实现它?或者三元运算符是唯一的方法吗?

将您的标志检查放入函数中,例如

const doSomething = () => open && console.log('did something');
return <div onClick={doSomething}></div>
constdosomething=()=>open&&console.log('doSomething');
返回

将您的标志检查放入功能中,例如

const doSomething = () => open && console.log('did something');
return <div onClick={doSomething}></div>
constdosomething=()=>open&&console.log('doSomething');
返回

由于onClick属性需要一个函数才能工作,因此您所能做的最好的类似于原始sintax的事情如下所示:

const Component = () => {
  const [open, setOpen] = React.useReducer(open => !open, false)

  const doSomething = () => console.log('did something')

  return <div onClick={() => (open && doSomething())}></div>
}
const组件=()=>{
const[open,setOpen]=React.useReducer(open=>!open,false)
const doSomething=()=>console.log('doSomething')
返回(打开&doSomething())}>
}

由于onClick属性需要一个函数才能工作,因此您所能做的最好的类似于原始sintax的事情如下所示:

const Component = () => {
  const [open, setOpen] = React.useReducer(open => !open, false)

  const doSomething = () => console.log('did something')

  return <div onClick={() => (open && doSomething())}></div>
}
const组件=()=>{
const[open,setOpen]=React.useReducer(open=>!open,false)
const doSomething=()=>console.log('doSomething')
返回(打开&doSomething())}>
}

为什么不在处理程序本身中处理条件

比如:

const组件={
const[open,setOpen]=React.useReducer(open=>!open,false)
const doSomething=useCallback(()=>{
如果(!打开){
返回;
}
log('do something');
}, []);
返回
}

考虑使用
useCallback
,这样可以避免在状态更新时重新定义
doSomething

为什么不在处理程序本身中处理条件

比如:

const组件={
const[open,setOpen]=React.useReducer(open=>!open,false)
const doSomething=useCallback(()=>{
如果(!打开){
返回;
}
log('do something');
}, []);
返回
}

考虑使用
useCallback
,以便在状态更新时避免重新定义
doSomething

我建议检查
open
内部doSomething

const doSomething = () => {
  if (!open) return;
  // actually do something
}

这样你就可以完全摆脱三元语句,你的onClick只依赖于doSomething,而不是open和doSomething。

我建议检查
open
内部doSomething

const doSomething = () => {
  if (!open) return;
  // actually do something
}

这样,你就可以完全摆脱三元语句,而你的点击只依赖于DOWOMENT,而不是打开和DOWMENTION。

你是否考虑在<代码> DOMMETHONSE()/代码>中检查<代码>打开/代码>?你是否考虑在<代码> DOMMETHONSE()/COD>内检查<代码>打开/代码>?
const doSomething = () => {
  if (!open) return;
  // actually do something
}