gpt4 book ai didi

javascript - LitElement 中的传单用法

转载 作者:行者123 更新时间:2023-12-03 08:26:04 26 4
gpt4 key购买 nike

我目前正在开发一个使用 LitElement 组件的应用程序。我想将 Leaflet 集成到其中,但在显示 map 时遇到问题。我已经使用 npm 在我的项目中安装了 Leaflet,并创建了一个如下所示的类。

import {LitElement, html, css} from 'lit-element';
import './node_modules/leaflet/dist/leaflet';

class Map extends LitElement{

static get styles() {
return [css``];
}

constructor() {
super();
}
connectedCallback() {
super.connectedCallback();
let map = L.map('mapid').setView([51.505, -0.09], 13);

let urlTemplate = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png';
map.addLayer(L.tileLayer(urlTemplate, {minZoom: 4}));
}

render() {
return html`
<link rel="stylesheet" href="./node_modules/leaflet/dist/leaflet.css">
<div id="mapid" style="height: 100%"></div>

`;
}
}

customElements.define("my-map", Map);

运行我的应用程序会导致以下错误:未捕获类型错误:无法设置未定义的属性“L”。我对如何使用 Leaflet 在 LitElement 应用程序中显示 map 有点迷失,并且非常感谢您插入我走向正确的方向。

最佳答案

对于 Lit 项目,我们倾向于建议人们坚持使用 es-module 导入(尽管这是可选的)。因此,而不是从导入

import './node_modules/leaflet/dist/leaflet';

尝试:

import {map as createMap, tileLayer} from './node_modules/leaflet/dist/leaflet-src.esm.js';

这是因为它通常更适合 Web 组件的模块化特性,并且 bundler 可以比调用 window.L 更有效地优化 es 模块

接下来,重写此语法的传单调用。例如

let map = L.map('mapid').setView([51.505, -0.09], 13);

// should be
let map = createMap('mapid').setView([51.505, -0.09], 13);

// and
map.addLayer(L.tileLayer(urlTemplate, {minZoom: 4}))

// should be
map.addLayer(tileLayer(urlTemplate, {minZoom: 4}))

接下来,需要全局 ID 才能运行的库在使用影子 DOM 作为影子根范围 DOM 并因此查询其根的 Web 组件中往往会出现问题。不过,幸运的是,leaflet's documentation表明我们可以向它传递一个元素引用而不仅仅是一个 id。这意味着我们需要像这样获取元素引用:

const mapEl = this.shadowRoot.querySelector('#mapid');

然后我们可以将其传递给 createMap 函数

const mapEl = this.shadowRoot.querySelector('#mapid');
let map = createMap(mapEl).setView([51.505, -0.09], 13);

最后我们会发现我们遇到了 mapElnull 的问题。这是因为 LitElement 在 firstUpdated lifecycle callback 之前不会渲染其内容。 。这意味着我们必须将 map 创建的位置从 connectedCallback 更改为 firstUpdated

这是代码的工作示例,其中我还添加了一些样式来为自定义元素提供一定的高度:https://jsbin.com/fumusodake/edit?html,output

关于javascript - LitElement 中的传单用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66600326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com