代码之家  ›  专栏  ›  技术社区  ›  stackjlei

es6扩散运算符如何处理对象以支持转换?

  •  1
  • stackjlei  · 技术社区  · 8 年前

    我知道为了 {...todo} 要在Todo组件中工作,必须将其转换为类似于以下内容的道具: completed=false text="clean room" 但传播算子是如何做到这一点的?不会是电流 {…待办} 转变为 {completed:false}, {text:"clean room"} ?

    const TodoList = ({ todos, onTodoClick }) => (
      <ul>
        {todos.map(todo =>
          <Todo
            key={todo.id}
            {...todo}
            onClick={() => onTodoClick(todo.id)}
          />
        )}
      </ul>
    )
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Felix Kling    8 年前

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

    JSX只是一种语法糖 React.createElement

    您可以使用 Babel repl 来看看JSX是如何转换的。

    无扩展道具:

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

    使用扩展道具:

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

    因此,您可以看到,如果道具包含扩展道具,它们将被分离为多个对象,然后简单地合并。

        2
  •  1
  •   Cent    8 年前

    es6排列运算符确实通过转换 {...todo} to {completed:false} , {text:"clean room"} .

    然而,JSX中使用了相同的运算符,但不一定是相同的。

    从…起 msdn docs ,

    扩展语法允许在以下位置扩展表达式 多个参数(用于函数调用)或多个元素(用于 数组文字)或多个变量(用于破坏赋值) 应为。

    按照这个想法 JSX spread operator 已创建。根据 React docs ,

    数组已支持…运算符(或排列运算符) ES6中也有一个ECMAScript对象Rest和 排列属性。我们正在利用这些支持和 开发标准,以便在JSX中提供更简洁的语法。