как добавить ссылку из компонента forwardref без рендеринга?

#reactjs #mapbox #use-ref

Вопрос:

Я передаю узел dom во всплывающее окно mapbox. У меня есть компонент P. js, который состоит из прямой ссылки как

 import React  from "react";

const P = React.forwardRef((props, ref) => {
  return  <p {...props} ref={ref}></p>
})
export default P;
 

Я импортирую его в App.js как

 import P from './P';
......

const pRef = useRef(null)
console.log(pRef)
const p = <P ref={pRef}/>
console.log(pREf)

const App = () => {
useEffect(() => {
..... //codes
marker.setPopup(new mapboxgl.Popup().setDOMContent(pRef.current))

})  

}
 

Как я могу передать этот рендеринг ref другому компоненту и запустить его в другом?

В моем случае я попытался сделать еще одну константу, чтобы повысить ценность

 const p = <P ref={pRef}/>
 

Я думаю, что это не способ передачи ссылки из другого компонента, поэтому она не отображается.
Есть ли какие-либо методы в компоненте маркера , которые я могу передать, если вместо этого загрузить содержимое dom .
Спасибо вам за помощь.

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

1. Вы имеете в виду что-то вроде twitter.com/realamirhe/status/1362457891609919489 ?

2. @Amirhe я думаю, что это сработало, поставив <P ref={pRef}> при возврате app.js, но это сделало содержимое dom p видимым для всей карты , их , есть ли какой-либо способ , не используя его при возврате, пожалуйста, спасибо

3. Я думаю, я мог бы решить эту проблему, дайте мне знать, если есть какая-либо серая зона или проблема

Ответ №1:

Я настоятельно рекомендую использовать эту оболочку react вокруг mapbox-gl именованного react-mapbox-gl

Вы можете использовать метод, упомянутый в этом твите, и добавить некоторый стиль в свой тег P, чтобы сделать его, кстати, невидимым

 <P class="hide">Hello world</P>
 
 .hide { display: none } /* or any other that fits for you e.g. visibility hidden */
 

Вы также можете использовать renderToString для преобразования вашего компонента в HTML-строку на лету.

 import * as React from 'react';
import { renderToString } from 'react-dom/server';
import mapboxgl from 'mapbox-gl';

const P = React.forwardRef((props, ref) => {
  return <p {...props} ref={ref}></p>;
});

export default function App() {
  React.useEffect(() => {
    marker.setPopup(
      new mapboxgl.Popup().setDOMContent(
        // render your Paragraph component exactly to html
        renderToString(<P>Hello world</P>),
      ),
    );
  });

  return <div id="map" />;
}
 

Вот код и поле для демонстрации того, что это работает.

Вы также можете передать точно такое же строковое представление компонента вашего абзаца, предложенное в документе пакета

 const popup = new mapboxgl.Popup()
.setHTML('<h1>Hello World!</h1>') // here is the string representation
.addTo(map);
 

Если вы хотите работать с пакетом js из-за устаревшей проблемы, существует также пакет, который поможет вам добавить пользовательскую крошечную оболочку react вокруг пакета для работы с именем react-aptor