代码之家  ›  专栏  ›  技术社区  ›  Zach Smith

如何使用JSX“collected”将react元素上的属性定义为单个对象?

  •  0
  • Zach Smith  · 技术社区  · 6 年前

    在此反应代码中:

    const App = ({val}) => {
      console.log(val) // logs 20 to console
      return <div>val</div>
    }
    
    <App val={20} val2={1}/>
    

    我明白,这场争论传到了 App 函数是一种“隐式”破坏。即我使用的地方 应用程序 (通过JSX)我注解到属性: val , val2 . 这些属性是 收集 到一个对象中: {val: 20, val2: 1} ,因此JSX生成的javascript如下所示:

    App({val: 20, val2: 1})
    

    然后在争论中 应用程序 我实际上是这样破坏的:

    const {val} = {val: 20, val2: 1}
    

    所以从JSX的转换来看 <App val={20} val2={1}> 破坏发生的“相反”。这是正确的吗?

    发生这种情况的过程是否利用了“rest”操作?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Andrey Bodoev    6 年前

    简而言之,它是由JSX解析器完成的,解析器实现之一是 https://github.com/RReverser/acorn-jsx .

    这个过程的例子是,

    • 查看JSX代码,逐行查看;
    • 根据规范识别反应元件(见下文);
    • 对于每个元素,将解析它们的属性和值。把他们推进 attributes 数组。以后会是什么 props 对象 React.createElement .

    描述JSX语法的规范可以在这里找到 https://github.com/facebook/jsx .

        2
  •  2
  •   Estus Flask    6 年前

    JSX syntax 句法上的糖分 React.createElement , JSX props 句法上的糖分 react.createElement(反应.createElement) props参数,它是一个对象。

    <App val={20} val2={1}/>
    

    句法上的糖分

    React.createElement(App, { val: 20, val2: 1 });
    

    剩下的道具, spread attributes 它们适用于对象扩展语法。

    <App val={20} val2={1} {...rest}/>
    

    是ES2018的句法糖吗?

    React.createElement(App, { val: 20, val2: 1, ...rest });
    

    或ES6

    React.createElement(App, Object.assign({ val: 20, val2: 1}, rest));