Я пытаюсь использовать React Hooks, где в компоненте, который я ранее использовал как основанный на классе. Компонент выглядит следующим образом:
class A extends Component {
constructor(props) {
super(props)
this.mapRef = createRef()
this.map = new Map({ ... })
}
componentDidMount() {
this.map.setTarget(this.mapRef.current)
}
// Also shouldComponentUpdate & componentWillUnmount
render() {
return (
<div>
<div ref={this.mapRef}></div>
{this.props.children({map: this.map})}
</div>
)
}
}
Мое понимание библиотеки открытых слоев состоит в том, что когда я создаю экземпляр объекта Map, мне нужно передать ему ссылку на элемент DOM, поскольку библиотека требуетпрямой контроль над элементом DOM. Я делаю это в функции componentDidMount
через ref
.
Пытаясь изменить этот код на React Hooks (из интереса), я пробовал это:
function A (props) {
var map
const mapRef = useRef(null)
useEffect(() => {
map = new Map()
map.setTarget(mapRef.current)
})
return (
<div>
<div ref={mapRef}></div>
{props.children({map})}
</div>
)
}
Что только ошибки (потому что функция props.children
получает null
для объекта карты). Я попытался переместить инициализацию объекта карты из функции, которая, кажется, работает:
const map = new Map({ ... })
function A (props) {
const mapRef = useRef(null)
useEffect(() => {
map.setTarget(mapRef.current)
// Then adjust the map however necessary depending on props
})
return (
<div>
<div ref={mapRef}></div>
{props.children({map})}
</div>
)
}
Это несколько работает ... хотя кажется, что обратный вызов useEffect
срабатывает гораздо чаще, чем необходимо. И я должен выяснить, как реализовать shouldComponentUpdate
.
Это «правильный» подход к использованию React Hooks? Я не могу удержаться от ощущения, что в этом случае либо компонент класса имеет гораздо больше смысла, либо я неправильно использую крючки (возможно, последний).
В этом случае я на самом деле не используюКомпонент класса для состояния вообще, а скорее для возможности использовать методы жизненного цикла для обновления экземпляра карты из-за изменений DOM.