你能解释一下这个反应原生代码(渲染方法中的奇怪箭头函数)吗?

Posted

技术标签:

【中文标题】你能解释一下这个反应原生代码(渲染方法中的奇怪箭头函数)吗?【英文标题】:Can you explain this react native code (strange arrow function in render method)? 【发布时间】:2021-03-16 04:14:15 【问题描述】:

所以这是我正在阅读的教科书中的一些 React Native 代码,特别是来自 App.js 的渲染方法。当然 /* ...*/ 会填写实际代码,但这与我的问题无关。

<MeasureLayout>
        layout => (
            <KeyboardState layout=layout>
                keyboardInfo => /* … */
            </KeyboardState>
        )
</MeasureLayout>

我不明白layout =&gt; (... 发生了什么。所以我认为 layout 是一个箭头函数,它返回这个keyboardState 组件。那么layout如何在&lt;KeyboardState layout=layout&gt;这部分将自己传递到keyboardState的layout prop中呢?我为什么要这样做呢?这里的整个部分真的让我感到困惑。

【问题讨论】:

它叫做render prop,恰好是children prop。 【参考方案1】:

看到 inside render 方法用于一些javascript语句。

例如。

<Text>
personFirstNam +" " +personLastName
</Text>

但是现在在您的代码中 中再次包含 JSX 元素,它在未命名函数中使用。

layout => (
 ...// here you can use JSX element which will be returned into render method for UI.
)

或者,如果你想在那里进行一些操作,

layout =>
 let extractData = fromSomeWhere;
 let calculatePosition = getPosition();
 return (<KeyboardState layout=layout>
            keyboardInfo => /* … */
        </KeyboardState>)

所有这些都是为了在一个 JSX 元素中执行一些 JS 语句执行/操作。

【讨论】:

【参考方案2】:

React 组件具有 propschildren 属性。 children 属性通常是 React 节点,但也可以是返回 React 节点的函数。


那么在这部分,layout 是如何将自己传递到keyboardState 的layout 属性中的呢?

创建了MeasureLayout 组件,以便将其children 属性定义为函数而不是React 节点。

而我为什么要这样做呢?

用于依赖注入并作为一种模式,允许使用基于类的组件进行更具声明性的编程风格。


更深入的阅读:

主题:作为孩子的功能

https://medium.com/merrickchristensen/function-as-child-components-5f3920a9ace9

https://codedaily.io/tutorials/6/Using-Functions-as-Children-and-Render-Props-in-React-Components

【讨论】:

我不相信它与基于类的组件有关。任何组件(函数或类)都可以从渲染道具中受益。【参考方案3】:

&lt;MeasureLayout&gt; 将参数作为函数传递给它的子代。并使用箭头函数来接收它。

所以,&lt;MeasureLayout&gt; 的代码基本上是,

function MesauseLayout(props)
 //Do things 
 // layout = some result.
  return <div>props.children(layout)</div>

所以,为了接收这个值,孩子必须在一个接受这个值的函数中。所以,使用箭头函数来接收这个值。

<MeasureLayout>
        layout => (
            <KeyboardState layout=layout>
                keyboardInfo => /* … */
            </KeyboardState>
        )
</MeasureLayout>

但在我看来,如果可能的话,使用带有钩子的 Context/Provider 将是一个更好的选择。这通常只在极端情况下使用。还有另一个选项可以使用 React.cloneElement 并传递额外的道具。但是,如果您必须在这两者之间进行选择,则需要权衡取舍。另外,还有一个概念叫做render props,在新的库中很常用。

【讨论】:

以上是关于你能解释一下这个反应原生代码(渲染方法中的奇怪箭头函数)吗?的主要内容,如果未能解决你的问题,请参考以下文章

vue 组件传值,传过来的值不能被渲染,怎么办?

你能解释一下这个 dart json 解析代码吗?

反应原生 |循环渲染 FlatList 的项目

反应原生渲染 Facebook 登录

渲染后调用的函数反应原生

反应原生的电话