zoukankan      html  css  js  c++  java
  • React:Composition

    在日常的UI构建中,经常会遇到一种情况:组件本身更多是作为一个容器,它所包含的内容可能是动态的、未预先定义的。这时候它的内容取决另一个组件或外部的输入。比如弹层。

    props.children:

    React在组件中提供了props.children这个内置变量。当我们创建一个用作容器的组件时,在其返回的JSX中插入{props.children},此时{props.children}表示将来容器中需要插入的的内容。

    比如我们创建一个带边框的div作为容器,

    1 //一个带边框的div组件
    2 function FancyBorder(props) {
    3   return (
    4     <div className={'FancyBorder FancyBorder-' + props.color}>
    5       {props.children}
    6     </div>
    7   );
    8 }

    以后某个组件在输出的模板中调用了FancyBorder后,所有位于<FancyBorder></FancyBorder>标签内的内容将被看作FancyBorder组件的props.children。

     1 function WelcomeDialog() {
     2   return (
     3     <FancyBorder color="blue">
     4       <h1 className="Dialog-title">
     5         Welcome
     6       </h1>
     7       <p className="Dialog-message">
     8         Thank you for visiting our spacecraft!
     9       </p>
    10     </FancyBorder>
    11   );
    12 }

    当然,更普遍的情况是,我们要分发到容器上的内容,是需要指定位置的。

    比如某段文字应该放在容器的右边,而某条评论或图片放在左边。这时候怎么办呢?

    props.children给了我们启发。

    JSX,也即要渲染的内容,可以作为参数prop传递给组件,然后在组件中恰当的位置进行渲染。要知道,React Element用typeof操作符判断时,其输出是‘object’,对象当然可以作为参数传递给函数啦!

     1 function SplitPane(props) {
     2   return (
     3     <div className="SplitPane">
     4       <div className="SplitPane-left">
     5         {props.left}
     6       </div>
     7       <div className="SplitPane-right">
     8         {props.right}
     9       </div>
    10     </div>
    11   );
    12 }
    13 
    14 function App() {
    15   return (
    16     <SplitPane
    17       left={
    18         <Contacts />
    19       }
    20       right={
    21         <Chat />
    22       } />
    23   );
    24 }

    这就解决了组件内容的嵌套和分发。

    在React构建UI组件时,变量、方法、组件都可以作为props传递给子组件,实现单向的数据传输。

    Specialization:定制化处理(我是这么理解啦)

    我们常常需要用组件来实现一个特定的模块/视图。比如一个弹层,可以是警告,也可以是登陆框,更可以是某个内容展示。

    既然我们可以通过props来分发内容,自然可以利用它来对定制一个符合我们期望的组件。

    通过给容器传入各种参数、React Element,我们完全可以控制在模板的什么地方展示什么内容。这一切都通过props进行集合处理。

    例子就不给了,跟上边一样,记住:

    props.children分发容器标签之中的内容

    props.xxx 分发其他指定内容

  • 相关阅读:
    ubuntu 构建Xilinx交叉编译环境
    codeSourcery交叉编译环境
    ZYNQ学习之路1. Linux最小系统构建
    静态代码块的执行顺序
    storm maven-shade-plugin
    spring 3.2.7 applicationContext.xml
    ZipUtils
    成员内部类
    jetty jndi数据源
    applicationContext中普通数据源不用jndi数据源
  • 原文地址:https://www.cnblogs.com/alan2kat/p/7469908.html
Copyright © 2011-2022 走看看