- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 React 文档中他们说:
React also supports using a string (instead of a callback) as a ref prop on any component, although this approach is mostly legacy at this point.
https://facebook.github.io/react/docs/more-about-refs.html
看下面的例子:
class Foo extends Component {
render() {
return <input onClick={() => this.action()} ref={input => (this._input = input)} />;
}
action() {
console.log(this._input.value);
}
}
为什么我应该更喜欢这个,而不是:
class Foo extends Component {
render() {
return <input onClick={() => this.action()} ref='input' />;
}
action() {
console.log(this.refs.input.value);
}
}
?
第二个示例似乎更干净、更简单。
字符串方法是否存在被弃用的风险?
注意:我正在寻找文档中声明的“官方”答案,我不是询问个人偏好等。
最佳答案
虽然可能更简单,但旧的 refs API 在某些边缘情况下可能会变得困难,例如在回调中使用时。所有类型的静态分析对于字符串来说也是一种痛苦。基于回调的 API 可以完成字符串 API 可以做的所有事情甚至更多,只需增加一点冗长即可。
class Repeat extends React.Component {
render() {
return <ul> {
[...Array(+this.props.times)].map((_, i) => {
return <li key={i}> { this.props.template(i) } </li>
})
} </ul>
}
}
class Hello extends React.Component {
constructor() {
super();
this.refDict = {};
}
render() {
return <Repeat times="3" template={i => <span ref= {el => this.refDict[i] = el}> Hello {i} </span>} />
{/* ^^^ Try doing this with the string API */}
}
}
可以从 issue #1373 找到有关基于字符串的 api 可能出现的问题的进一步讨论和更全面的列表。 ,其中引入了基于回调的 api。我将在此处包含问题描述中的列表:
<小时/>The ref API is broken is several aspects.
You have to refer to this.refs['myname'] as strings to be Closure Compiler Advanced Mode compatible.
It doesn't allow the notion of multiple owners of a single instance.
Magical dynamic strings potentially break optimizations in VMs.
It needs to be always consistent, because it's synchronously resolved. This means that asynchronous batching of rendering introduces potential bugs.
We currently have a hook to get sibling refs so that you can have one component refer to it's sibling as a context reference. This only works one level. This breaks the ability to wrap one of those in an encapsulation.
It can't be statically typed. You have to cast it at any use in languages like TypeScript.
There's no way to attach the ref to the correct "owner" in a callback invoked by a child.
<Child renderer={index => <div ref="test">{index}</div>} />
-- this ref will be attached where the callback is issued, not in the current owner.
文档将旧字符串 API 称为“旧版”,以明确基于回调的 API 是首选方法,如 this commit 中所述。并在 this PR那些实际上首先将这些陈述放入文档中的人。另请注意,一些评论暗示基于字符串的 refs api 可能会在某个时候被弃用。
关于reactjs - 为什么 ref ='string' 是 "legacy"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37468913/
我正在实现 Android Room Database,在其中一个教程中我发现了 androidx.legacy:legacy-support-v4:1.0.0 的用法依赖。谁能告诉我使用这种依赖关系
我收到来自某些旧代码的 SOAP 请求,并使用 JAX-WS 生成的对象来处理该请求,该对象来自旧代码使用的同一 WSDL,但在处理该请求时收到 Unmarshalling Error:unmarsh
我遇到了很多错误,比如 /usr/local/include/opencv2/legacy/legacy.hpp:2994:12: error: 'CvSubdiv2DEdge' does not n
在更新 Flutter 和一些软件包后,我一直得到 Failed to resolve: androidx.legacy:legacy-support-v4:27.0.1 error 我已将我的项目迁
任何有用的指标都可以 最佳答案 我在代码中寻找的一件事是单元测试。这将提供重构它的自由。所以如果代码没有测试,我认为它是遗留代码。 关于legacy - 你什么时候说代码是遗留代码?,我们在Stack
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
有没有人有将FxCop引入遗留代码的经验?如果有人引入违反规则的代码,我们希望构建失败。但是暂时而言,这是不可能的,因为遗留代码有9000多次违规。 抑制错误的唯一方法是通过SuppressMessa
我听说许多开发人员将代码称为“遗留”。大多数时候,它是由不再参与该项目的人编写的代码。是什么构成了代码、遗留代码? 更新响应:“从祖先、前辈或过去传下来的东西”http://www.thefreedi
我们在工作中遇到过这样的情况:在遗留(核心)系统上工作的开发人员在向已被意大利面条式代码感染的现有代码中添加新功能时,被迫使用 GOTO 语句。 现在,我知道使用“只使用一个小 GOTO”而不是花时间
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
多年来,我听到很多关于我们开发人员必须使用的继承项目的提示。 WTF网站上有无数的示例代码,这些代码使我实际上喃喃自语“WTF?”。 但是,实际上没有向您提供使您离开的代码吗,“这真是深思熟虑!”或“
好吧,在我工作的地方,在过去的几十年中,我们维护了相当数量的系统。 该系统的多样性在于,可以使用多种操作系统(Linux,Solaris,Windows),多种数据库(oracle,sybase和my
我们是一个研究遗留代码的团队,这些代码非常古老,并且是用最初的编程语言编写的。由于团队成员接受了最新技术的培训,并且现在开始处理遗留代码,他们并不满意。如何激励他们也使用遗留代码? 最佳答案 只有现金
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 5年前关闭。 Improve this
我知道它是在 IBM 360 大型机架构上实现的,但有谁知 Prop 体使用了什么语言?据说其中大部分是在 3-4 个月内编程和部署的——对于任何项目来说,这都是一个相当快的周转,更不用说有能力监控整
我正在考虑在 Azure 上运行我们的一些业务。 我正在尝试选择最适合我公司的服务,但我收到的信号很复杂。 因为我正在启动一个新系统,所以我想选择非“旧版”(也称为“当前”)的产品。但似乎没有直接的方
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: What makes code legacy? “遗留代码”的定义是什么? 最佳答案 引导 Michael Feat
我正在制作一个应用程序,为客户提供大致的贷款报价(稍后由其他后台系统计算)。我从我们为其制作计算器的金融公司收到了一些代码。我的问题是我不理解计算年百分比率(包括启动费和月费)的代码部分。 他们可能正
我正在尝试关注 this教程并遇到 Node.js 安装问题。在 Debian VM 上安装,并在 nodejs 站点上运行建议的安装命令: curl -sL https://deb.nodesour
我是一名优秀的程序员,十分优秀!