`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" и теперь работаю с отправкой

Другие вопросы по тегам