【问题标题】:Is it a good practise to inject properties into ReactJS functional components using literal dot notation setters?使用文字点符号设置器将属性注入 ReactJS 功能组件是一种好习惯吗?
【发布时间】:2026-02-15 09:15:01
【问题描述】:

在摆弄别人编写的 React 代码时,我偶然发现了这种模式:

// So far so good:
const displayName = 'aComponentsName'
const propTypes = {
  // not important
}

const aFunctionalComponent = () => 'someJSX, not important'

// That's what baffles me:
aFunctionalComponent.displayName = displayName
aFunctionalComponent.propTypes = propTypes

我知道从技术上讲,函数是对象,它们可以有属性,甚至方法:

const func = () => 'somevalue'

func.foo = 'foo'
func.bar = 'bar'
func.baz = () => 'hello world'

console.dir(func) // Sadly, can't be expanded in SO sandbox, but the props are there
console.log(func.foo, func.bar)
console.log(func.baz())

我的问题是:可以吗?你用它吗?将一堆(相当静态的)类似状态的属性注入到无状态组件中是一种巧妙的方法,还是我应该避免的一种黑客攻击?

【问题讨论】:

  • 这取决于foobar 的用途。

标签: javascript reactjs function object properties


【解决方案1】:

displayNamepropTypes 是特定属性,这就是示例中设置它们的原因。

displayName 是包含函数名称的非标准化属性。与name 不同,它可以手动设置并包含可读的名称,即使在函数被缩小时也是如此。它可以用于调试(特别是通过 React devtools)或作为提供原始函数名称的常用方式,例如:

function callFn(fn) {
  console.log('Calling function: ',  fn.displayName || fn.name);
  return fn();
}

callFn(aFunctionalComponent);

propTypesprop-types 用于在运行时进行类型检查。

将数据作为函数属性提供是好是坏取决于具体情况。

【讨论】:

  • 谢谢。所以我可以得出结论,在displayNamepropTypes 的情况下,没关系。使用这种“注入”?
  • 我不会称之为注射。这些属性提供有关功能的附加数据。在这些特定情况下没关系。
最近更新 更多