`self.send` в ReasonReact Ошибка времени компиляции
Учитывая следующее:
$cat src/Greeting.re
let component = ReasonReact.reducerComponent("Greeting");
type action =
| Click;
type state = {
count: int
};
let make = (_children) => {
...component,
initialState: () => {count: 0},
reducer: (action, state) =>
ReasonReact.Update({count: state.count + 1}),
render: (self) => {
let message = "Clicked " ++ string_of_int(self.state.count) ++ "x";
<div>
<button
onClick={_event => self.send(Click)}
/>
{ReasonReact.stringToElement(message)}
</div>
}
};
Я получаю следующую ошибку во время компиляции:
17 ┆ <div>
18 ┆ <button
19 ┆ onClick={_event => self.send(Click)}
20 ┆ />
21 ┆ {ReasonReact.stringToElement(message)}
This record expression is expected to have type
ReasonReact.componentSpec (state, 'a, 'b, 'c, 'd)
The field send does not belong to type ReasonReact.self
ninja: build stopped: subcommand failed.
>>>> Finish compiling(exit: 1)
Я не понимаю Может кто-нибудь объяснить, пожалуйста, что это за ошибка и как ее исправить?
2 ответа
Вы должны разместить свой let component = ReasonReact.reducerComponent("Greeting");
линия непосредственно перед make
декларация, вот так:
…
let component = ReasonReact.reducerComponent("Greeting");
let make = (_children) => {
...component,
initialState: () => {count: 0},
…
Причина этого заключается в том, что тип элемента редуктора выводится на основе других типов (а именно state
а также action
) поэтому он должен иметь возможность "видеть" их, когда он объявлен.
Кроме того, для записи, вы должны увидеть предупреждение в bsb
Вывод об этом:
Это ReasonReact reducerComponent или компонент с сохраненными реквизитами? Если да, то объявлен ли тип для состояния, оставленных реквизитов или действий после объявления компонента? Перемещение этих типов над объявлением компонента должно решить эту проблему!
Попробуй запустить npm run start
еще раз, чтобы увидеть предупреждения!
У меня была похожая проблема, и я решил изменить self.send с self.reduce, попробуйте изменить:
<button
onClick={_event => self.send(Click)}
/>
в:
<button
onClick=(self.reduce(_event => Click))
/>
Я не уверен, но, возможно, self.reduce - это старый API, так что, вероятно, у нас есть старая версия чего-то
РЕДАКТИРОВАТЬ: я просто обновить причину реагировать на "0.3.1" и теперь работаю с отправкой