XHP:指南

2018-10-18 11:29 更新

以下是使用XHP时要了解和遵循的一般使用指南。除了其基本用法可用的方法扩展XHP与您自己的对象,这些是其他提示,以充分利用XHP。

属性和儿童的验证

XHP对象子元素和属性的约束在不同时间完成:

  • 儿童约束在渲染时(toString()明确或隐含调用时)进行验证。
  • 属性名称和类型在标签或通过属性设置时进行验证setAttribute()。
  • @required 在所需属性被读取时被验证。

此验证默认启用。您可以在使用XHP之前运行以下代码来关闭它:

:XHP :: $ ENABLE_VALIDATION = FALSE

使用上下文访问较高级别的信息

如果您有parent对象,并且要向UI树(例如,<ul>to <li>)进一步向某个对象提供信息,则可以为这些较低对象设置上下文,较低对象可以检索它们。你使用setContext()和getContext()

<?hh

class :ui-myparent extends :x:element {
  attribute string text @required;
  children (:ui-mychild);

  protected function render(): XHPRoot {
    return (
      <dl>
        <dt>Text</dt>
        <dd>{$this->:text}</dd>
        <dt>Child</dt>
        <dd>{$this->getChildren()}</dd>
      </dl>
    );
  }
}

class :ui-mychild extends :x:element {
  attribute string text @required;

  protected function render(): XHPRoot {
    if ($this->getContext('hint') === 'Yes') {
      return
        <x:frag>{$this->:text . '...and more'}</x:frag>;
    }
    return
      <x:frag>{$this->:text}</x:frag>;
  }
}

function guidelines_examples_context_run(string $s): void {
  $xhp = (
    <ui-myparent text={$s}>
      <ui-mychild text="Go" />
    </ui-myparent>
  );
  $xhp->setContext('hint', $s);
  echo $xhp;
}

guidelines_examples_context_run('No');
echo "\n\n";
guidelines_examples_context_run('Yes');

Output

<DL> <DT>文本</ DT> <DD>没有</ DD> <DT>子</ DT> <DD>转到</ DD> </ DL>

<dl> <dt>文本</ dt> <dd>是</ dd> <dt> Child </ dt> <dd> Go ... and more </ dd> </ dl>

上下文只在渲染时传递给树; 这允许您构建一个树,而不需要通过数据。一般来说,你只应该调用孩子getContext()的render()方法。

常见用途包括:

  • 当前用户ID
  • 当前主题在多主题网站
  • 当前浏览器/设备类型

不要将公共方法添加到您的XHP组件

XHP对象只能通过其属性,上下文,树中的位置和呈现它们进行交互。在Facebook,我们还没有遇到任何公共方法比这些接口更好的解决方案的情况。

Use Inheritance Minimally

如果您需要一个XHP对象像另一个,但稍作修改,使用组合。类别和属性克隆可用于提供通用接口。

Remember No Dollar Signs

属性声明看起来像Hack属性声明:

public string $prop;
attribute string attr;

一个关键的区别是没有$在属性名称前面。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号