Первый пример передает элемент c JSX <Counter />
как RenderParam
проп. Во втором примере используется функция instantiatedCounter
, которая позволяет возвращать более динамический c элемент JSX, обычно называемый Render props .
Во втором случае вы теряете состояние, потому что React каждый раз обрабатывает ReactElement
prop как только что определенный компонент, отключает старый и снова подключает его при каждом цикле рендеринга. Вам нужно вызвать опору ReactElement
для получения элемента JSX в качестве возвращаемого значения:
function RenderParam({ ReactElement }) {
return <div>{ReactElement()}</div>;
// not: return <div><ReactElement /></div>
}
Вы также можете определить его с помощью синтаксиса JSX <div><ReactElement /></div>
. Но затем убедитесь, что instantiatedCounter
является функцией stati c и не создается заново при каждом рендеринге, поэтому ссылка на объект остается неизменной:
const instantiatedCounter = () => <Counter />;
// make it static in some way, so object reference doesn't change
export default function App() {
// .. and remove instantiatedCounter here
return <RenderParam ReactElement={instantiatedCounter} />
}