【问题标题】:How can I pass arguments to event listeners in react?如何在反应中将参数传递给事件侦听器?
【发布时间】:2022-01-10 08:34:33
【问题描述】:

我正在努力使我的代码简洁易读。所以我决定创建一个自定义挂钩来存储我的useStates。然后我创建了一个新文件来存储我的事件监听器。现在,我有三个文件:Page.jsuseStates.jsListeners.js

问题是我不能在事件监听器中使用我的状态。


我尝试将我的状态存储在useStates.js 的全局范围变量中,并使用getter 传递它们。但它不起作用,因为更新状态并没有改变页面(但它确实重新渲染)。


useStates.js:

import react, { useState } from 'react';

export default () => {
  const [myState, setMyState] = useState(false);
  return { myState, setMyState };
}

Page.js:

import react from 'react';
import useStates from './useStates';
import { someActionListener } from './listeners';

export default () => {
  const states = useStates();

  return <SomeComponent
            somProp={states.myState}
            onSomeAction={ someActionListener } />
}

Listeners.js:

export const someActionListener = (e) => {
  // This should be done
  states.setMyState(!states.myState);
} 

【问题讨论】:

  • 请分享您正在使用的代码的minimal reproducible example
  • 同意...我们无法帮助调试我们看不到的代码。还请尝试更详细地描述具体是什么不起作用。是否有任何错误,您采取了哪些调试步骤,是否有重现任何问题的步骤等...
  • @evolutionxbox 完成。
  • 您只能在反应组件或钩子中使用状态..而不是标准 JS。由于您的 Listeners.js 不是反应组件而不是钩子,因此您不能在其中使用状态
  • onSomeAction={e =&gt; someActionListener(e, states)}

标签: javascript reactjs react-hooks frontend


【解决方案1】:

您可以将states 传递给监听器:

export const someActionListener = (e, states) => {
  // This should be done
  states.setMyState(!states.myState);
}

...

<SomeComponent
  somProp={states.myState}
  onSomeAction={e => someActionListener(e, states)}
/>

或者 curry states 值,从而使 UI 更干净,它保存了匿名函数回调:

export const someActionListener = states =>  e => {
  // This should be done
  states.setMyState(!states.myState);
}

...

<SomeComponent
  somProp={states.myState}
  onSomeAction={someActionListener(states)}
/>

我建议调整动作侦听器以进行回调。无论如何,事件侦听器通常都会这样做。 curried 函数是关闭回调并返回事件侦听器回调的简单方法。这将状态和状态更新与事件侦听器逻辑分离,允许 React 组件同时使用它们来保持对状态及其更新方式的控制。

export const someActionListener = (callback) => (e) => {
  // This should be done
  callback();
}

将状态更新函数作为回调传入。

export default () => {
  const states = useStates();

  return (
    <SomeComponent
      somProp={states.myState}
      onSomeAction={someActionListener(
        () => states.setMyState(!states.myState))
      )}
    />
  );
}

或者使用功能状态更新,因为您正在切换状态值。这是为了避免回调中的陈旧状态附件。

<SomeComponent
  somProp={states.myState}
  onSomeAction={someActionListener(
    () => states.setMyState(states => ({
       ...states
       myState: !states.myState
    })
  }
/>

【讨论】:

  • 感谢您的回答,但我认为 GACy20 在 cmets 中的回答更直接。
  • @NavidNaseri 两种解决方案都有效地转发了something。它可能更直接,但可能不那么干净。如果我的回答看起来更冗长,那是因为它试图帮助您避免一些简单的陷阱。干杯,祝你好运!
猜你喜欢
  • 2015-12-07
  • 2011-09-18
  • 2010-12-24
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多