当前位置: 首页 > 面试题库 >

在子组件中使用箭头函数反应传递参数

乌翔
2023-03-14
问题内容

我有这些父级和子级组件,我想通过点击功能在子级组件中选择一个项目。但是,似乎子组件中的函数会自动调用,而不是等到用户单击元素后才开始调用。为了更清楚一点,这里是我的父级和子级组件

export class ParentView extends Component {
  state = {
    selectedItem: {}
  }

  handleClick = (item) => {
    alert('you click me');
    this.setState({selectedItem: item});
  }

  render() {
    let item = { name: 'Item-1' };
    return (
      <div>
        <ChildItem item={item} handleClick={this.handleClick} />
      </div>
    );
  }
}

export class ChildItem extends Component {
  render() {
    const {item, handleClick} = this.props;
    return (
      <div>
        <a  onClick={handleClick(item)} />
      </div>
    );
  }
}

这些是我使用箭头函数传递handleClick给子组件的组件,但是警报始终在第一次渲染时被调用,而不会被用户触发。有什么建议吗?


问题答案:

您应该将函数本身传递给onClick,而不是传递的函数调用的结果。

如果要使用param调用它,则可以选择:

  • 用其绑定itemhandleClick.bind(this, item)bind创建一个新函数将具有预定义的第一个参数-item
  • 通过新的箭头html" target="_blank">功能,如 () => handleClick(item)

下面的例子:

export class ChildItem extends Component {
  render() {
    const { item, handleClick } = this.props;

    return (
      <div>
        <a onClick={() => handleClick(item)} />
      </div>
    )
  }
}

在您的代码中,您要调用onClick声明中的函数,因此handleClick执行结果将传递给onClick,这很可能不是您想要实现的。

<a onClick={handleClick(item)} />

更新:

正如@dhilt所写,这种方法有一个缺点。由于新创建的箭头函数以及.bind每次调用render方法时也会创建新函数ChildItem,因此与以前的“缓存”
render方法结果相比,react会将生成的react元素威胁为不同的元素,这意味着可能导致将来会出现性能问题,甚至对于eslint都有关于此问题的规则,但是由于两点,您不应该仅遵循此规则。

1)performance problems应加以测量。我们不禁止使用Array.prototype.forEach常规,for因为for相同或“更快”。

2)将单击处理程序定义为类属性会导致增加组件实例的初始化步骤。重新渲染反应快速有效,因此有时初始渲染更为重要。

只需使用对您更有利的产品,并可能阅读类似https://cdb.reacttraining.com/react-inline-functions-and-
performance-bdff784f5578的
文章



 类似资料:
  • 我了解在ES6中arrow函数是如何工作的,词法也是如此,但我想知道是否有人知道将参数传递给arrow函数的方法? 在ES5中,您可以简单地执行以下操作: 但是,在ES6中,如果使用箭头函数,如下所示: 变量返回一个对象,该对象与参数非常接近。 所以,我想知道是否有人有办法将参数传递给arrow函数? 我想也许我应该给一些关于我试图完成的事情的信息,也许如果上面的不可能,有人有更好的主意。 基本上

  • 我有一个react组件,我想用不同的参数调用相同的箭头函数,但我被困在如何传递参数给它,现在我在问自己,我能做到吗?

  • JavaScript箭头函数 let x = [1,2,3,4,5,6,7,8]; x.sort( (a,b) => b-a ); console.log(x); 实现逆序的原理是什么? 求大佬解惑

  • 问题内容: 在React中,我有类似的文件 parent.js 包含文本框和按钮 child.js 包含P标签 App.js 包含父组件和子组件 问题 将“父级”上的“文本框”值传递给子级,并将其显示在子级标记中。 完整代码 堆叠 问题答案: 更新了示例以将数据传递给子组件。 https://stackblitz.com/edit/react- trmj9i?file=child.js 在下面添加

  • 问题内容: 新的es6箭头功能说在某些情况下是隐式的: 该表达式也是该函数的隐式返回值。 在什么情况下需要使用es6箭头功能? 问题答案: 隐式返回,但仅当没有块时才返回。 * 当单线扩展到多行并且程序员忘记添加时,这将导致错误。 * 隐式返回在语法上是模棱两可的。返回对象…对吗?错误。它返回。这些括号是一个明确的块。是一个标签。 我会在此添加一个块的定义: 块语句(或其他语言的复合语句)用于将零

  • 我目前试图从react中实现tic tac toe示例,但使用的是钩子和ES6标准,但我似乎无法调用USEstate。我不断得到这些错误: 第6:33行:React Hook“usestate”在函数“game”中被称为,它既不是React函数组件,也不是自定义React Hook函数react-hooks/rules-of-hooks 这是我当前的代码: 多谢!