我正在学习如何将 Three.js 集成到 Polymer 的 Lit-Element 中。我当前的问题是我需要引用 div 元素来附加 Three 的 Renderer 元素。通常是这样做的:
box = document.getElementById("box")
box.appendChild(renderer.domElement)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法找到如何从 constructor()/firstUpdate() 引用渲染函数中声明的 div。你会怎么做?
这是我目前最好的结果: 渲染器元素偏离目标
下面是获得此结果的代码: HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<box-test></box-test>
<script type="module" src="src/components/box-test.js" crossorigin></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
JavaScript:
import { LitElement, html } from '@polymer/lit-element';
import * as THREE from 'three/build/three.module';
class BoxTest extends LitElement {
constructor() {
super();
var scene = new THREE.Scene();
var camera = …Run Code Online (Sandbox Code Playgroud) 我有一个简单的检查清单,每个项目都有一个删除按钮。当我检查第一个项目然后删除它时,列表更新,删除该项目,但选中下一个项目的复选框。下一项的属性是正确的。
这是我的代码:
import { LitElement, html } from 'lit-element';
class CheckList extends LitElement {
static get properties() {
return {
items: { type: Array },
};
}
constructor() {
super();
this.items = [
{
id: 1,
text: 'Item 1',
isDone: false,
},
{
id: 2,
text: 'Item 2',
isDone: false,
},
];
this.toggleCheck = this.toggleCheck.bind(this);
this.deleteItem = this.deleteItem.bind(this);
}
render() {
return html`
<ul>
${this.items.map(item => html`
<li>
<input
type="checkbox"
value=${item.id}
?checked=${item.isDone}
@click=${this.toggleCheck}
>
${item.text}
<button @click=${this.deleteItem}>X</button>
</li>
`)}
</ul> …Run Code Online (Sandbox Code Playgroud) 我正在构建一个桌面应用程序,用于监视某些事物并生成有关其正在监视的内容的数据。当用户想要与数据交互时,应用程序会启动一个非常简单的网络服务器。服务器提供静态页面并具有基本的 http API 来提供数据。我使用 html 作为通用 UI,用户使用浏览器查看数据并与之交互。
我想使用 Google 的 Lit 2 将我的 html/css/js 重写为基于组件的 Web 应用程序。我喜欢纯 Web 组件的想法,但我注意到 Lit 提供了一些很棒的附加功能。毫不奇怪,大多数 Lit 文档都面向具有构建步骤的更传统的 Web 环境。我想看看是否可以让我的服务器尽可能简单并避免传统的后端工具(打字稿编译、缩小等)。我想用一系列简单的 js 文件中的 Lit 组件替换当前的静态 html/css/js。
目前,我的服务器从“公共”目录为我的页面提供服务,并具有最小的 http API:
- public/
-- js/
-- css/
-- index.html
Run Code Online (Sandbox Code Playgroud)
我应该如何在没有构建步骤的系统中使用 Lit?我需要与我自己的继承自 LitElement 的 javascript 类一起提供的最小 Lit 文件集是多少?
我有一个LitElement,代表多个文件的文件上传。这使用代表每个文件的子组件。
我正在努力寻找使用LitElements将更改传播到子组件中的最佳做法的示例,因为它似乎与Polymer 3完全不同
这是我正在尝试的简化示例:
import './uploadFile.js';
class Upload extends LitElement {
...
static get properties() { return { files: Object } }
_render({files}) {
return html`
<input type="file" multiple onchange="...">
${this.renderFiles(files)}`
}
renderFiles(files) {
const filesTemplate = [];
for (var i = 0; i < files.length; i++) {
filesTemplate.push(html`
<upload-file file="${files[i]}"></upload-file>
`);
}
return filesTemplate;
}
}
Run Code Online (Sandbox Code Playgroud)
当我更新文件的状态时,上载组件会重新渲染,但上载文件组件不会。
我在这里做错了什么?那里没有LitElement用法的示例。
TIA
我目前正在学习如何使用 lit-element v2.0.0-rc.2 我有两个组件 app.js 和 list-items.js。在 app.js 中,我从本地存储中收集数据并将其存储在 this.todoList 中,然后我在我的 list-items.js 中调用 this.todoList 但我遇到的问题是它没有将数据作为数组传递但作为一个对象,我试图在列表项中输出该数据,当我执行 this.todoList 的 console.log 时,我得到的所有数据是 [object] 在我的
class TodoApp extends LitElement{
static get properties(){
return{
todoList: Array
}
}
constructor(){
super();
let list = JSON.parse(localStorage.getItem('todo-list'));
this.todoList = list === null ? [] : list;
}
render(){
return html `
<h1>Hello todo App</h1>
<add-item></add-item>
<list-items todoList=${this.todoList}></list-items>
`;
}
}
customElements.define('todo-app', TodoApp)
list-items.js
import { LitElement, html …Run Code Online (Sandbox Code Playgroud)我有一个简单的 LitElement 组件,如下所示:
class MyElement extends LitElement {
constructor() {
super();
}
customMethod(data) {
// do something with the passed parameter
}
render() {
return html`<div id="element"></div>`;
}
}
customElements.define('my-element', MyElement);
Run Code Online (Sandbox Code Playgroud)
我希望能够从我的元素外部调用该 customMethod。
例如,如果我将元素添加到网页,如下所示:
<my-element></my-element>
Run Code Online (Sandbox Code Playgroud)
然后我希望能够向页面添加一些 JavaScript 并调用该 customMethod。
我试过:
var element = document.getElementById('element');
element.shadowRoot.customMethod('example data');
Run Code Online (Sandbox Code Playgroud)
但它声称它不可用...我如何调用 LitElement 实例上的方法?
因此,我正在开发一个非常小的 Web 组件,作为更大的设计系统的一部分。
我对 Web 组件的使用有点陌生,但我知道这个特定的 Web 组件可以在单个布局中使用很多很多次。
此 Web 组件控制在传递给它的任何子组件周围放置多少垂直空间。
该组件的结构非常简单:
import { LitElement, html, css, unsafeCSS, property, customElement } from 'lit-element';
export const spacingAmounts = {
'x-small': css`4px`,
'small': css`8px`,
'medium': css`12px`,
'large': css`16px`,
'x-large': css`20px`,
'2x-large': css`30px`,
'3x-large': css`40px`,
'4x-large': css`60px`,
'5x-large': css`90px`,
'6x-large': css`120px`,
};
const createSpacingStyleRules = (direction: 'top' | 'bottom') => {
return Object.keys(spacingAmounts).map(s => {
const amount = spacingAmounts[s];
return css`
:host([${unsafeCSS(direction)}="${unsafeCSS(s)}"]) {
margin-${unsafeCSS(direction)}: ${unsafeCSS(amount)};
}
`;
});
};
@customElement('gu-vertical-space')
export class GuVerticalSpace …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个使用 LitElement 组件的应用程序。我想将 Leaflet 集成到其中,但在显示地图时遇到问题。我已经使用 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);
Run Code Online (Sandbox Code Playgroud)
运行我的应用程序会导致以下错误:未捕获类型错误:无法设置未定义的属性“L”。我对如何使用 Leaflet 在 LitElement 应用程序中显示地图有点迷失,并且非常感谢您能推动我走向正确的方向。
我们有一个显示标题标题的自定义模板元素,我们希望扩展此组件,以便在单击按钮时也显示带有面包屑的标题标题。
示例代码:
... private getTemplateResultFromProperty: TemplateResult[] = []; ...
//This works fine:
func1(): TemplateResult {
return html`
<custom-header-template
.data=${data}'>
</custom-header-template>`
}
//Can't return concatenated header
func2(): TemplateResult {
//repeat does not work, this returns empty strings
return html`${repeat(this.getTemplateResultFromProperty, t => t)}`;
}
Run Code Online (Sandbox Code Playgroud)
我们只能在func2方法中通过指定数组元素而不使用 html`` 来返回并显示新标头,如下所示:return this.headerTemplateArray[1]但这不是我们想要做的。
错误消息:Uncaught (in promise) TypeError: Cannot read property 'split' of null at new Template (template.js:87)当我们尝试这样做时:return html`${this.getTemplateResultFromProperty}`;
在这种方法中, html`` 方法似乎对我们根本不起作用...所以我们怀疑我们使用Repeat() 的方式可能存在问题,或者我们以错误的方式连接/使用 TemplateResult 。
有任何想法吗?
lit-element ×10
lit-html ×5
javascript ×3
polymer ×3
lit ×2
breadcrumbs ×1
css ×1
leaflet ×1
performance ×1
polymer-3.x ×1
three.js ×1