【问题标题】:Understanding destructive assignment of a component in Reactjs了解 Reactjs 中组件的破坏性分配
【发布时间】:2019-05-13 19:15:44
【问题描述】:

我有以下 React 组件:

export default function AuthExample () {
  return (
    <Router>
      <div>
        <AuthButton/>
        <ul>
          <li><Link to="/public">Public Page</Link></li>
          <li><Link to="/protected">Protected Page</Link></li>
        </ul>
        <Route path="/public" component={Public} />
        <Route path="/login" component={ Login } />
        <PrivateRoute path='/protected' component={ Protected } />
      </div>
    </Router>
  )
}

我的困难是理解传递给组件的参数以及它是如何在创建这个组件的函数中拆箱的,下面是函数:

const PrivateRoute = ({ component: Component, ...rest }) => (
  <Route {...rest} render={(props) => (
    fakeAuth.isAuthenticated === true
      ? <Component {...props} />
      : <Redirect to={{
          pathname: '/login',
          state: { from: props.location }
        }} />
  )} />
)

那么这里的component: Component 到底是什么?是 ES-5 destructive assignment 吗?那么&lt;Component {...props} /&gt;到底是什么?

【问题讨论】:

  • 不叫“破坏性赋值”。这是解构赋值。 “破坏性”意味着某些东西被破坏了,但实际上解构赋值是避免改变原始对象或数组的有用方法。所以从某种意义上说,它是破坏的反面。

标签: reactjs ecmascript-6


【解决方案1】:

{ component: Component, ...rest } 将属性 component 分配给变量 Component。您可以阅读有关解构分配的信息here

&lt;PrivateRoute path='/protected' component={ Protected } /&gt; 中,您将Protected 作为component 属性传递,然后ProtectedPrivateRoute 组件内被引用为Component 变量。 这只是为了您的方便。这是 JSX 要求的,以便区分标准 html 元素和用户定义的组件。

&lt;Component {...props} /&gt; 中,{...props} 表示从props 对象中获取所有键值对并将它们传递给Component。查看this stackoverflow answer 以获得更好的说明。

其实就是下面这行

const PrivateRoute = ({ component: Component, ...rest }) => ();

意思

从传递给该组件的属性中获取component,将其存储为Component,并将所有其他属性保存在rest 变量中。

【讨论】:

    【解决方案2】:

    您首先将以下两个道具传递给PrivateRoutepathcomponent。 函数头({ component: Component, ...rest })的意思是,你可以给它传递一个对象,它会寻找一个键为component的属性并将其存储为Component,其余的属性,如果有的话, 将被放入rest 对象中。在这种情况下,您的组件参数将是您传递的组件Protected,而rest 将包含path

    关于&lt;Component {...props} /&gt;: 它是对象解构,这基本上意味着该对象中的key: value 对,在您的情况下为props,将在那里登记。

    所以,用一个对象:

    const myProps = {
        name: 'John',
        age: 21
    }
    

    并用作:

    <MyComponent { ...myProps } />
    

    这和你这样做是一样的:

    <MyComponent name={myProps.name} age={myProps.age} />
    

    【讨论】:

    • “它会寻找带有组件键和组件类型的属性”——这不是真的。该行的重点是将component 存储为Component。它没有说明这个属性的类型。
    • 你说得对,我在考虑TS,谢谢。更新了答案。
    【解决方案3】:

    {component: Component} 确实是解构赋值,在函数参数的上下文中也称为"argument unpacking"

    它只是在这个函数的范围内给道具component 一个新名称Component。 JSX 语法需要all user defined components to be capitalized。 (&lt;component /&gt; 不起作用。只有原生 dom 元素可以小写:&lt;span /&gt; 等)

    虽然语法上允许在 prop 名称中使用任何大小写(因此您可以简单地使用 { Component } 代替,但 props 的约定是使用 camelCase,遵循 DOM 属性和变量名称的常规 javascript 约定。

    所以你传入的 prop 叫做component,但在组件函数内部却是Component

    【讨论】:

    • 感谢您的解释,只是为了回答我问题的第二部分,Component 实际上到底是Protected 吗?
    • 是的,当您传入component={ Protected } 时,这就是在该实例中分配给Component 的内容。
    猜你喜欢
    • 2022-01-25
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多