LitElement中的单张使用

Leaflet usage in LitElement(LitElement中的单张使用)
本文介绍了LitElement中的单张使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我当前正在使用LitElement组件开发一个应用程序。我想把传单整合进去,在显示地图方面有问题。我已经在我的NPM项目中安装了传单,并创建了一个如下所示的类。

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);
运行我的应用程序导致以下错误:未捕获TypeError:无法设置未定义的属性‘L’。 我对如何使用宣传单在我的LitElement应用程序中显示地图有点迷惑,如果能推动我朝着正确的方向前进,我将感激不尽。

推荐答案

对于LIT项目,我们倾向于建议人们坚持使用ES模块导入(虽然这是可选的)。因此,不是从导入

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

改为尝试:

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

这是因为它通常更符合Web组件的模块化特性,而且捆绑程序可以比调用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之前不会呈现其内容。这意味着我们必须将地图创建位置从connectedCallback更改为firstUpdated

以下是您的代码的一个工作示例,我还在其中添加了一些样式,以使自定义元素具有一定的高度:https://jsbin.com/fumusodake/edit?html,output

这篇关于LitElement中的单张使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)