首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >es6扩展操作符是如何对对象进行支持转换的?

es6扩展操作符是如何对对象进行支持转换的?
EN

Stack Overflow用户
提问于 2016-08-19 04:05:28
回答 2查看 1.3K关注 0票数 1

我知道为了让{...todo}在Todo组件中工作,必须将它转换为类似于:completed=false text="clean room"的道具,但是扩展操作符是如何做到这一点的呢?当前的{...todo}不是被转换为{completed:false}, {text:"clean room"}吗?

代码语言:javascript
复制
const TodoList = ({ todos, onTodoClick }) => (
  <ul>
    {todos.map(todo =>
      <Todo
        key={todo.id}
        {...todo}
        onClick={() => onTodoClick(todo.id)}
      />
    )}
  </ul>
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-19 13:24:45

正如已经确定的那样,这里使用的扩展语法与ES6无关,它是一个JSX结构。

JSX只是React.createElement调用的语法糖。道具实际上是作为对象传递给该函数的。

您可以使用巴别勒查看JSX是如何转换的。

没有铺开的支柱:

代码语言:javascript
复制
// In
<Component foo="bar" baz="42" />

// Out
React.createElement(
  Component,
  { foo: "bar", baz: "42" }
);

用散开的支柱:

代码语言:javascript
复制
// In
<Component foo="bar" {...xyz} baz="42" />

// Out
React.createElement(
  Component,
  Object.assign({ foo: "bar" }, xyz, { baz: "42" })
);

因此,您可以看到,如果道具包含一个扩展支柱,它们被分离成多个对象并简单地合并。

票数 1
EN

Stack Overflow用户

发布于 2016-08-19 04:24:13

es6扩展运算符确实是通过转换{...todo} to {completed:false}{text:"clean room"}来工作的。

但是,在JSX中使用相同的操作符,但并不一定是相同的。

来自msdn文档

扩展语法允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)或多个变量(用于析构赋值)的地方展开表达式。

按照这个想法,创建了JSX spread operator。根据反应文档的说法

那个..。ES6中的数组已经支持运算符(或扩展运算符)。还有一个关于对象Rest和扩展属性的ECMAScript建议。我们正在利用这些支持和开发的标准,以便在JSX中提供更干净的语法。

既然这已经跟随了传播者的想法,两者的统一的确是一个受社会欢迎的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39030927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档