【问题标题】:How does React Natives Stylesheet.create work?React Native Stylesheet.create 是如何工作的?
【发布时间】:2021-12-29 17:46:57
【问题描述】:

这里是创建方法的代码。

  create<+S: ____Styles_Internal>(obj: S): $ReadOnly<S> {
    // TODO: This should return S as the return type. But first,
    // we need to codemod all the callsites that are typing this
    // return value as a number (even though it was opaque).
    if (__DEV__) {
      for (const key in obj) {
        if (obj[key]) {
          Object.freeze(obj[key]);
        }
      }
    }
    return obj;
  },

这个函数是如何工作的,

【问题讨论】:

标签: reactjs react-native flowtype


【解决方案1】:
create<+S: ____Styles_Internal>(obj: S): $ReadOnly<S> {

定义一个名为create 的函数,该函数有一个名为obj 的参数。它是类型注释的,使用Flow,含义如下:

  • 参数objS类型,用obj: S表示
  • 其中S____Styles_Internal 的类型或子类型,由&lt;+S: ____Styles_Internal&gt; 表示。 +variance sigil,表示接受 covariant 类型(作为子类型的类型以及类型本身)
  • 返回类型是obj 的只读版本,用$ReadOnly&lt;S&gt; 表示
    if (__DEV__) {
      for (const key in obj) {
        if (obj[key]) {
          Object.freeze(obj[key]);
        }
      }
    }

for...in 迭代enumerable properties,如果属性的值为真,则该值被Object.freeze 冻结。该值通常是一个对象(请参阅 React Native 的样式表文档中的 examples),因此冻结它会阻止对象被更改。这些事情只发生在__DEV__ 变量为true,表示代码在开发环境中运行。

我没有编写代码,所以我只能推测它为什么会这样:

  • 根据代码作者的commit 消息,此行为可能仅在开发中发生,因为它可能会破坏生产应用程序:

我真的不知道我们是否有/需要任何比登陆它更安全的方式来推出它。如果传递给 StyleSheet.create 的对象在之后发生突变,它可能会中断,但这不是我见过的任何做法。

  • 我不知道为什么要测试是否冻结是真实的。
  • 我不确定为什么对象需要冻结,但我怀疑这是为了消除变化样式对象的意外副作用,因为 React 可能会通过引用比较渲染之间的样式对象。
    return obj;
  },

返回对象。

进一步阅读

【讨论】:

  • 这是一个很好的解释,但代码仍然让我感到困惑。如果它没有在开发模式下运行,那么它在哪里评估 CSS 代码并将其应用到浏览器中(返回 obj??)。我正在尝试在自己的项目中理解/重新创建此功能。
  • 您最初的问题似乎是基于StyleSheet.create 评估CSS代码并将其应用于视图的前提。它不是。我认为您已澄清的问题是new question,因为答案很长并且超出了该问题的范围;但一个简单的总结是样式对象被传递给 React Native 的 JavaScript 组件上的 style 属性,它通过 React 的 diffing 算法,通过 JavaScript 和本机代码之间的桥梁进行传输,并且本机代码在本机组件上设置样式。跨度>
  • Stylesheet.create 中的 css 得到评估,我认为是为了确保其正确的 css 代码。我对什么机制允许将 CSS 包含在 JS 文件中并使用感到困惑。
  • 这里没有 CSS 代码,只有在 JavaScript 对象中建模 CSS 规则的样式对象,因此不评估 CSS。 StyleSheet.create 评估 CSS 的前提是一个误解。如果使用静态类型检查器(例如 Flow),则在编译时会进行检查以确保样式对象中的属性值是该属性所代表的 CSS 规则的有效值。在运行时,可能会检查是否可以在本机代码中设置这些值。但是我还没有深入研究 React Native 的源代码来理解这一点。
  • 是的,它只是返回它的输入。如果你看一下 git 历史,这个函数用来做更多的事情。至于为什么它现在只返回它的输入,你必须阅读提交消息并做出一些有根据的猜测事实上,有人已经在引入更改的提交上留下了 comment 询问这个问题,尽管它没有收到了相关回复。我怀疑它为什么仍然存在是为了尽量减少不同版本的 React Native 之间的中断 API。
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2020-09-02
  • 1970-01-01
相关资源
最近更新 更多