【问题标题】:reactjs this.refs vs document.getElementByIdreactjs this.refs vs document.getElementById
【发布时间】:2016-09-13 10:06:15
【问题描述】:

如果我只有一个基本的表格,我应该还是this.refs 还是只用document.getElementById

我的基本意思是:

export default class ForgetPasswordComponent extends React.Component {
  constructor(props) {
    super(props);

    this.handleSendEmail = this.handleSendEmail.bind(this);
  }

  handleSendEmail(e) {
    e.preventDefault();

    // this.refs.email.value
    // document.getElementById('email').value
  }

  render() {
    <form onSubmit={this.handleSendEmail}>
      <input id="email" ref="email" type="text" />
      <input type="submit" />
    </form>
  }
}

使用其中一个有缺点吗?

【问题讨论】:

  • 如果您在单个页面中有多个 ForgetPasswordComponent 实例,或者如果您有任何其他 id 为“email”的元素,则可能会选择错误的元素。
  • 如果我使 id 尽可能唯一(因为 id 在 html 中应该是唯一的)我还应该选择 refs 还是 ids?使用 refs 有缺点吗?

标签: javascript reactjs


【解决方案1】:

一般来说,refsdocument.getElementById 更好,因为它更符合你的 React 代码的其余部分。

在 react 中,每个组件类都可以有多个组件实例。
正如@Isuru 在 cmets 中指出的那样:使用 id 是危险的,因为 react 不会阻止您在一页上有多个表单,然后您的 DOM 包含具有相同 ID 的多个输入。这是不允许的。

使用 refs 的另一个优点是,根据设计,您只能在定义它的上下文中访问 refs。如果您需要访问此上下文之外的信息,这会迫使您使用道具和状态(可能还有商店)。
这是一个优势,因为您破坏单向数据流的机会更少/没有机会,这会使您的代码更难管理。

注意:几乎在所有情况下,都可以完全避免使用 refs。 Netflix 的设计原则是no refs, ever,正如 Steve McGuire(Netflix 的高级用户界面工程师)在 this video from reactjs conf 2016(视频 9:58 米)中所解释的那样。
在您的情况下,这意味着将电子邮件输入值置于表单状态,添加 onChange 处理程序,并在提交事件中使用状态值。

【讨论】:

  • +1 提到在大多数情况下您不需要使用它们中的任何一个,但应该使用 value + onChange(或 LinkedStateMixin)。
  • 我读过关于 state 的使用,我只是有点犹豫要不要使用它,因为有很多实现,比如添加 valueonchangevaluestate 以及当有表单中有很多字段,您将开始拥有很多字段。呵呵。那么真的更喜欢使用 value + state + onchange 吗?
  • 是的,它优于 refs。 Refs 是一种捷径,随着应用程序的发展,它可能会让您陷入调试噩梦。
  • 如果 Refs 开始通过道具传递给孩子,也会增加您尝试做的事情的复杂性。如果您正在执行诸如嵌套滚动到顶部按钮之类的操作,我建议您使用 document.getElement.. 它会更干净,表明意图并且不涉及与状态相关的操作。在调用 scrollTo 之前,您可能需要检查以确认目标元素存在。但是,对于表单之类的东西,我强烈建议避免使用 refs 或 document.getElement 并找到一种使用状态来构造事物的方法。
  • 具有讽刺意味的是,Netflix 数据可视化负责人 Elijah Meeks 在 2017 年的主题讨论中建议在结合 React + D3 时使用 refsmedium.com/@Elijah_Meeks/…
猜你喜欢
  • 1970-01-01
  • 2018-05-10
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2017-10-10
  • 2014-12-03
  • 2015-11-04
相关资源
最近更新 更多