javascript - 使用文字点符号 setter 将属性注入(inject) ReactJS 功能组件是一种好习惯吗?

标签 javascript reactjs function object properties

在摆弄别人写的 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())

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

最佳答案

displayNamepropTypes 是特定的属性,因此在示例中设置了它们。

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

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

callFn(aFunctionalComponent);

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

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

关于javascript - 使用文字点符号 setter 将属性注入(inject) ReactJS 功能组件是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53719855/

相关文章:

javascript - jquery或native无法通过ID获取元素

javascript - 图像映射器 'rebind' 不工作

css - Tailwind 将元素对齐到父级的底部

javascript - 模拟 - 旨在在 1 个节点上运行。 0 找到代替

css - 如何让 React Material-UI Accordion 充满整个高度?

javascript - 当元素在窗口中时如何触发 jQuery 计数器?

javascript - Typescript 会解决这些后端环境不可预知的变化吗?

javascript - 如何使用character_limiter或word_limiter

javascript - 无法获取函数的值

javascript - 我应该将 jQuery 或 DOM 对象作为参数传递吗? (性能问题)