【问题标题】:How to hook data-grid events in parent lit-element component?如何在父 lit-element 组件中挂钩数据网格事件?
【发布时间】:2019-11-15 11:10:14
【问题描述】:

我想对放置在数据网格行中的元素启动的事件做出反应。 Vaading data-grid 防止事件冒泡到包含网格的父组件。将按钮放置在为每一行呈现的网格列中,我无法从承载网格的组件中捕获单击或任何其他事件。

https://vaadin.com/components/vaadin-grid/html-examples 中的示例依赖于附加在 html 文件中的 js 挂钩。我正在使用 Lit-element 并尝试在 firstUpdated() 回调中做同样的事情。问题是,显然此时该表不可用。

<vaadin-grid id="test" .items=${this.data} theme="compact">
    <vaadin-grid-column width="40px" flex-grow="0">
        <template class="header">#</template>
        <template>
            <vaadin-button style="font-size:10px;" theme="icon" focus-target @click="${(e) => { console.log(e) }}">
                <iron-icon icon="icons:create"></iron-icon>
            </vaadin-button>
        </template>
    </vaadin-grid-column>
</vaadin-grid>

我希望有日志,但没有任何反应,因为网格组件阻止事件冒泡到我的组件。

尝试为 vaadin-grid-column 实现渲染器属性的代码:

import { LitElement, html, css } from 'lit-element'
import {render} from 'lit-html';

import '@vaadin/vaadin-grid/vaadin-grid.js'
import '@vaadin/vaadin-grid/vaadin-grid-filter-column.js'
import '@vaadin/vaadin-grid/vaadin-grid-sort-column.js';
import '@vaadin/vaadin-grid/vaadin-grid-filter.js';
import '@vaadin/vaadin-grid/vaadin-grid-sorter.js'

export default class MyClass extends LitElement {
    static get properties () {
        return {
            data: { 
                type: Array,
                hasChanged: () => true
            },

        }
    }

    get grid() {
        return this.shadowRoot.querySelector('vaadin-grid');
    }

    constructor () {
        super()
        this.data = []//is being assigned from super as a property to a custom element 
    }
    render () {
        return html`
            <vaadin-grid id="test" .items=${this.data}>
                <vaadin-grid-column .renderer=${this.columnRenderer} header="some header text"></vaadin-grid-column>
            </vaadin-grid>
        `
    }

    columnRenderer(root, column, rowData) {
        render(html`test string`, root);
    }
}
window.customElements.define('my-elem', MyClass)

【问题讨论】:

  • 已编辑 1:添加了使用渲染器的代码。一个新问题是来自渲染器的 html 块作为 [object Object] 插入数据表中。只有纯字符串按预期填充。
  • 更新 1:我能够呈现将它们分配给 root.innerHTML 的 html 元素,但仍然没有跟踪事件。作为替代方案,我添加了 vaadin-grid-selection-column 并在所选项目上使用来自父级的事件
  • 更新2(最终):艾伦提出的解决方案对我的问题是正确的。 lit-html 渲染的问题与我拥有的自定义项目设置有关,而不是与用作起点的 pwa 入门工具包有关。
  • 我想知道是否有人可以将其更新为最近的“点燃”-当我尝试这样做时,我的 columnRenderer() 中出现了一些问题- 1. render() 似乎已经移动(或者它可能是一个没有移动的东西,它仍然是从 lit-html 导入的),2. 当我使用从 lit-html 导入的渲染时,它会渲染对象,所以有些东西发生了变化。
  • ^ 需要import { render } from 'lit/html.js';

标签: vaadin vaadin-grid lit-element


【解决方案1】:

在基于 LitElement 的组件中使用 vaadin-grid 时,您应该使用 renderers

这是使用渲染器的代码外观

import {LitElement, html} from 'lit-element';
// you need lit-html's render function
import {render} from 'lit-html';

class MyElement extends LitElement {
  // we'll just assume the data array is defined to keep the sample short
  render() {
    return html`
      <vaadin-grid id="test" .items=${this.data} theme="compact">
        <vaadin-grid-column width="40px" flex-grow="0" .renderer=${this.columnRenderer} .headerRenderer=${this.columnHeaderRenderer}></vaadin-grid-column>
      <vaadin-grid>
    `;
  }
  columnHeaderRenderer(root) {
    render(html`#`, root);
    // you could also just do this
    // root.textContent = '#'
    // or actually just use the column's header property would be easier tbh
  }
  columnRenderer(root, column, rowData) {
    render(
      html`
        <vaadin-button style="font-size: 10px;" theme="icon" focus-target @click="${(e) => { console.log(e) }}">
          <iron-icon icon="icons:create"></iron-icon>
        </vaadin-button>
      `, root);
  }
}

您可以在由 vaadin 团队成员之一创建的 Glitch 中看到 vaadin-grid 的这个以及更多功能在 LitElement 中的实际应用

【讨论】:

  • 您好,感谢您的回复。解决方案似乎几乎让我到达那里。我添加了渲染器,并且能够渲染简单的文本,并将其分配给 root.textContent。但是,当我使用 render() 时,表格呈现 [object Object] 而不是 HTML。经过一番调查,我能找到的最接近的问题是github.com/Polymer/lit-element/issues/390,但对于为什么会发生这种情况几乎没有什么想法。没有一个解决方案似乎对我有用。由于我们将渲染结果设置为列上的属性,因此传递对象而不需要字符串似乎是合乎逻辑的。
  • 附言。将示例移植到我的项目中具有相同的结果。 [object] 被填充而不是 html。显然问题出在设置中
  • 您能否发布一个示例,说明您如何尝试为您的应用进行渲染?
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多