То, что ищет bucklescript, удовлетворяет ошибке Functions are not valid as a React child.
, возникающей в следующем примере.
Имею эту привязку к withAuthenticator
от aws-amplify-react
.
[@bs.deriving abstract]
type props = {
[@bs.as "Comp"]
comp: React.element,
[@bs.optional] includeGreetings: bool,
};
[@genType.import ("aws-amplify-react", "withAuthenticator")] [@react.component]
external make:(
~props:props,
) => React.element = "withAuthenticator";
let default = make;
В Demo.re
я использую привязку следующим образом:
let props = {
WithAuthenticator.props(
~comp={
<App />;
},
~includeGreetings=true,
(),
);
};
Js.log(props);
[@react.component]
let app = () => <WithAuthenticator props />;
Затем в App.js
я использую Demo.re
вот так:
import Amplify from 'aws-amplify';
import {app as App } from './Demo.bs';
import awsconfig from './aws-exports';
import './App.css';
Amplify.configure(awsconfig);
export default App;
Это вызывает следующую ошибку:
Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
in withAuthenticator (created by Demo$app)
in Demo$app (at src/index.js:7)
Я хотел бы понять, что это значит, чтобы разобраться, когда он снова появится.
Это то, что скомпилированный код Bucklescript находится в Demo.bs.js
:
// Generated by BUCKLESCRIPT, PLEASE EDIT WITH CARE
'use strict';
var React = require("react");
var App$ReactHooksTemplate = require("./App.bs.js");
var WithAuthenticator$ReactHooksTemplate = require("../aws/WithAuthenticator.bs.js");
var props = {
Comp: React.createElement(App$ReactHooksTemplate.make, { }),
includeGreetings: true
};
console.log(props);
function Demo$app(Props) {
return React.createElement(WithAuthenticator$ReactHooksTemplate.make, {
props: props
});
}
var app = Demo$app;
exports.props = props;
exports.app = app;
/* props Not a pure module */
Воспроизведение этой проблемы можно найти здесь.
Обновлять:
Здесь я пытаюсь следить за комментариями / ответом @ glennsl ниже.
// define a type modeling what `withAuthenticator` is expecting
[@bs.deriving abstract]
type props = {
[@bs.as "Comp"]
comp: React.element,
[@bs.optional]
includeGreetings: bool,
};
// use bs.module instead of gentype
[@bs.module ("aws-amplify-react", "withAuthenticator")]
external withAuthenticator: props => React.component(props) =
"withAuthenticator";
module AppWithAuthenticator = {
[@bs.obj]
external makeProps:
(~children: 'children, unit) => {. "children": 'children} =
"";
let make = props => withAuthenticator(props);
};
Вот как он может использоваться, но не компилируется.
module AppWithAuth = {
let props = {
props(
~comp={
<App />;
},
~includeGreetings=true,
(),
);
};
[@react.component]
let make = () => {
<AppWithAuthenticator props />;
};
};
ошибка компиляции:
>>>> Start compiling
[1/3] Building src/aws/AuthenticatorBS-ReactHooksTemplate.cmj
We've found a bug for you!
/Users/prisc_000/working/DEMOS/my-app/src/aws/AuthenticatorBS.re 34:6-25
32 │ [@react.component]
33 │ let make = () => {
34 │ <AppWithAuthenticator props />;
35 │ };
36 │ };
This call is missing an argument of type props
withAuthenticator
- конструктор компонентов более высокого порядка. Функция, которая при применении к компоненту возвращает другой компонент. Вы не можете использовать его напрямую. - person glennsl   schedule 19.08.2019