【问题标题】:Should I avoid refs in favor of e.target, for testing purposes?出于测试目的,我应该避免使用 refs 来支持 e.target 吗?
【发布时间】:2015-12-23 05:18:52
【问题描述】:

我经常写这样的组件:

<input
    ref="ckbx"
    type="checkbox"
    checked={this.props.checked}
    onChange={() => this.props.onChange(this.refs.ckbx.checked)}
/>

但是,我现在发现这很难进行单元测试。 特别是,当使用Simulate.change 或Simulate.click 时,回调会传递复选框的初始值而不是新值(就像在浏览器中发生的那样)。 当我将 { target: { checked: false } } 添加为每个 Simulate 调用的第二个参数时,此行为仍然存在。

如果我改为使用它会起作用

<input
    type="checkbox"
    checked={this.props.checked}
    onChange={e => this.props.onChange(e.target.checked)}
/>

所以,我的问题是

  • 这是编写输入逻辑的首选方式吗?
  • 这是编写输入逻辑的唯一可单元测试的方式吗? 它看起来真的没有那么灵活(如果我需要考虑多个 ref 怎么办?)。
  • 我可以使用现有方法吗?
  • 我应该更换所有组件吗? (不难,但如果有更好的方法,我不想这样做。)

【问题讨论】:

    标签: javascript unit-testing reactjs


    【解决方案1】:

    正如您在React docs 中看到的,他们只使用e.target,我也总是使用e.target 的输入。 我强烈建议你尽可能避免在 React 中使用refs。首先,因为 React 团队称其为“逃生舱”。此外 - https://facebook.github.io/react/docs/more-about-refs.html#summary

    使用e.target,您可以模拟事件,它应该可以完美运行。

    【讨论】:

    • 抱歉,我对此不满意,特别是因为文档 also state 认为“执行 DOM 测量几乎总是需要接触到‘本地’组件,例如 &lt;input /&gt; 并访问其底层使用 ref 的 DOM 节点。Refs 是可靠地做到这一点的唯一实用方法之一。"
    猜你喜欢
    • 2012-07-15
    • 2012-10-14
    • 2010-09-23
    • 2018-06-16
    • 2011-12-31
    • 2021-06-03
    • 1970-01-01
    • 2011-03-26
    • 2020-12-15
    相关资源
    最近更新 更多