【问题标题】:Is there anyway to spread the return of a function call into props in jsx?有没有办法将函数调用的返回传播到 jsx 中的 props 中?
【发布时间】:2017-03-10 16:24:54
【问题描述】:

我想不出办法,但我想要的是:

<ColumnDef key="label" ...createCommonColumnProps.call(this, {somestuff}) />
<ColumnDef key="count" ...createCommonColumnProps.call(this, {someOtherStuff}) />
<ColumnDef key="value" ...createCommonColumnProps.call(this, {yetOtherstuff}) />

我希望它非常简单,我只是个白痴,但如果不创建变量,我就找不到方法

<ColumnDef key="label" {...column1} />
<ColumnDef key="count" {...column2} />
<ColumnDef key="value" {...column3} />

大约有5个props,其中一些受到传递给函数的对象的影响。

当我在 chrome devtools 控制台中尝试这个(只是 js 部分,而不是 jsx 部分)时,我看到了这样的事情:

> function a() {
   return {a:1, b:2}
 }
undefined
> y = {... a()}
VM341:1 Uncaught SyntaxError: Unexpected token ...
> x = ... a()
VM368:1 Uncaught SyntaxError: Unexpected token ...
> x = {a:1,b:2}
Object {a: 1, b: 2}
> y = {...x}
VM888:1 Uncaught SyntaxError: Unexpected token ...

【问题讨论】:

  • {...createCommonColumnProps.call(this, {somestuff})} ?

标签: javascript reactjs ecmascript-6 jsx spread-syntax


【解决方案1】:

JSX 对象扩展语法如下:

{...<expression>}

expression 返回一个对象的引用。

所以你的情况是

<ColumnDef key="label" {... createCommonColumnProps.call(this, {somestuff})} />

UPD 以反映您的问题更新:

当我在 chrome devtools 控制台中尝试这个(只是 js 部分,而不是 jsx 部分)时,我看到了这样的事情:

发生这种情况是因为尽管 JSX 对象扩展语法看起来类似于非标准化但 ES 对象扩展语法 - 它们不可互换(并且 chrome 尚不支持后者)。

所以,只要完全按照我在上面的示例中演示的方式使用它即可。

【讨论】:

  • 也许只是 chrome 控制台,但我遇到了这个问题:x = ... a(); VM368:1 Uncaught SyntaxError: Unexpected token ...
  • @boatcoder 你到底在做什么?谷歌浏览器不支持 JSX。
  • 但它确实支持大部分 ES6
  • 确实如此。 JSX 是一个独立的标准。你到底在控制台中运行了什么,现在有什么问题?
  • @boatcoder 很好,chrome 完全支持 ES2015(但模块),完全支持 ES2016,部分支持 ES2017。对象传播还不是真正的标准github.com/tc39/proposals 另外请参阅kangax.github.io/compat-table/es6
猜你喜欢
  • 1970-01-01
  • 2011-01-21
  • 2020-05-08
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2021-06-10
相关资源
最近更新 更多