Можете ли вы объяснить этот машинный код react (странная функция стрелки в методе рендеринга)?

#reactjs #react-native #jsx #react-props #arrow-functions

#reactjs #react-native #jsx #react-props #функции со стрелками

Вопрос:

Итак, это некоторый собственный код React из учебника, который я просматриваю, в частности, из метода рендеринга App.js . Конечно, /* …*/ будет заполнен фактическим кодом, но это не имеет отношения к моему вопросу.

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

Чего я не понимаю, так это того, что происходит с. {layout => (... Итак, я полагаю, что layout — это функция со стрелкой, которая возвращает этот компонент KeyboardState. Итак, как макет затем передается в макет KeyboardState в этой части <KeyboardState layout={layout}> ? И почему я должен хотеть сделать именно это? Вся эта часть здесь действительно сбивает меня с толку.

Комментарии:

1. Это называется render prop , это просто оказывается children prop.

Ответ №1:

Компоненты React имеют props children свойства и . children Свойство обычно представляет собой узел React, но оно также может быть функцией, которая возвращает узел React.


Итак, как макет затем передается в макет KeyboardState в этой части?

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

Комментарии:

1. Я не верю, что это вообще связано с компонентами на основе классов. Любой компонент (функция или класс) может извлечь выгоду из реквизитов рендеринга.

Ответ №2:

Посмотрите, что {} метод 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>)
}}
 

Все это заключалось в том, чтобы просто выполнить несколько операций / операций с JS-операторами внутри одного элемента JSX.

Ответ №3:

Он <MeasureLayout> передает аргумент своим дочерним элементам как функцию. и для его получения используется функция стрелки.

итак, в основном код <MeasureLayout> будет,

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

Итак, чтобы получить это, дочерний элемент должен быть внутри функции, которая принимает это значение. Итак, для получения этого значения используется функция со стрелкой.

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

Но, на мой взгляд, использование контекста / провайдера с хуком будет лучшим вариантом, если это возможно. Обычно это используется только в крайних случаях. Существует также другой вариант использования React.cloneElement и передачи дополнительных реквизитов. Но есть компромиссы, если вам нужно выбирать между этими двумя. Кроме того, существует концепция, render props которая обычно используется в новых библиотеках.