Заполнение ссылки с помощью mobx

#javascript #reactjs #mobx #mobx-react-lite

#javascript #reactjs #mobx #mobx-react-lite

Вопрос:

я пытаюсь создать пользовательский компонентный видеопроигрыватель с помощью react и mobx, и мне нужно выполнить переход от основного компонента к дочернему компоненту, но я получаю сообщение об ошибке, когда я использую функцию forwardRef для компонента, который является наблюдателем. сообщение об ошибке: «Базовый компонент не является функцией» Вот код:

 // code for main component
const videoPlayer = () => {

const controlsRef = useRef<any>(null);

return (<div>
// video player screen code //
<VideoPlayerButtonCode ref={controlsRef} />
<div>)

}

// the code for the players component

interface IProps{
 controlsRef: any;
}

const VideoPlayerButtonCode: React.FC<IProps> = fowardRef({props from iprops}, controlsRef ) => {

return (<div>

<Button ref={controlsRef}>Button i want to get a ref for from main</Button>
<div>)

}

export default observer(VideoPlayerButtonCode)

  

это расплывчатая абстракция кода, но та же реализация.
есть ли какая-либо помощь в поддержке mobx для ссылки или есть способ сохранить ссылку в хранилище mobx?

Ответ №1:

Какую версию mobx-react вы используете? Он должен нормально работать с последней версией 7.0.0, но, похоже, он не работает, если вы используете mobx-react-lite@3.0.0 .

На данный момент я создал codesandbox со всеми рабочими вариантами: https://codesandbox.io/s/httpsstackoverflowcomquestions64227496-75xdz?file=/src/App.js

Например, та же версия, что и ваша, работает нормально:

 const ComponentWithForwardRef = React.forwardRef((props, ref) => {
  return <div ref={ref}>My Observer Component</div>;
});

const ObserverComponentWithForwardRef = observer(ComponentWithForwardRef);
  

Существует также forwardRef опция для observer HOC, но в настоящее время она работает только с mobx-react-lite , и не работает с обычным mobx-react пакетом из-за этой ошибки https://github.com/mobxjs/mobx-react/issues/868

Вы можете использовать его так:

 const MyObserverComponent = observer(
  (props, ref) => {
    return <div ref={ref}>My Observer Component</div>;
  },
  { forwardRef: true }
);
  

Если все не удается, вы можете просто использовать пользовательский реквизит для своей ссылки следующим образом:

 <MyObserverComponentCustomRef innerRef={myRef} />

// ...

const MyObserverComponentCustomRef = observer((props) => {
  return <div ref={props.innerRef}>My Observer Component Inner Ref</div>;
});
  

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

1. Большое вам спасибо, оказывается, это была версия