标签: web-component

无法在 React 中使用 Web 组件

我正在尝试在 React 应用程序中使用一些 Web 组件。但是,React 无法检测 Web 组件标签。

import React from "react";
import "./App.css";
import "@vaadin/vaadin-button";
import "@vaadin/vaadin-text-field";

function App() {
  return (
    <div className="App">
      <vaadin-text-field label="First Name" ref="firstName" />
      <vaadin-text-field label="Last Name" ref="lastName" />
      <vaadin-button ref="addButton"> Add </vaadin-button>
    </div>
  );
}

export default App;
Run Code Online (Sandbox Code Playgroud)

我收到类似的错误

类型“JSX.IntrinsicElements”上不存在属性“vaadin-text-field”。

我是否需要使用Reactify-WC才能在 React 中使用 WebComponents?

vaadin web-component typescript reactjs lit

4
推荐指数
1
解决办法
1797
查看次数

如何处理事件并将其从定义组件传递到点亮组件

我正在尝试使用 lit Element 设计 Web 组件,并且我需要有关事件的帮助。正如我们从附加的代码片段中看到的,我们可以@change="${this.handleEvent}"在 html 模板中使用并处理该函数handleEvent(e){}并处理lit Element 组件内的通过这种方式,事件仅在点亮的 Web 组件中受到限制和控制。

然而,当其他人使用我们的 Web 组件时,他们对定义组件中这些事件的值没有太多控制或访问权限。例如,如果我们有一个 index.html 文件并且我像这样使用它<my-element onchange="handleEvent(e)"></my-element>,我应该有权访问 onchange 事件并仅调用索引文件内的函数。

那么,有没有一种方法可以实现与常规 html 事件类似的行为,而不是编写仅限于 lit Element Web 组件的事件。

<script src="https://unpkg.com/@webcomponents/webcomponentsjs@latest/webcomponents-loader.js"></script>
<script type="module">
  import { LitElement, html, css } from 'https://unpkg.com/lit-element/lit-element.js?module';
  
  class MyElement extends LitElement {
  
   static get properties() {
      return {
        checked:  { type: Boolean, attribute: true }
      };
    }
    
    static get styles() {
      return [
        css`
          div {
            padding: 10px;
            width: 90px;
            border: 2px …
Run Code Online (Sandbox Code Playgroud)

javascript vaadin web-component polymer lit-element

4
推荐指数
1
解决办法
1万
查看次数

this.getAttribute 在违反规范的情况下无法在 Web 组件中工作

我正在制作一个 Web 组件,它将显示“Hello {name}!” 从哪里来。{name}name="foo"当我尝试它时,我没有收到任何错误,但它只显示“Hello null!”。
索引.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./script.js"></script>
</head>
<body>
  <hello-world name="Joe"></hello-world>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

脚本.js:

class HelloWorld extends HTMLElement {
  constructor() {
    super();

    this.attachShadow({ mode: 'open' });

    const p = document.createElement('p');

    p.innerHTML = `Hello ${this.getAttribute('name')}!`;

    this.shadowRoot.append(p);
  }
}

customElements.define('hello-world', HelloWorld);
Run Code Online (Sandbox Code Playgroud)

在任何情况下,我们假设name总是有一个输入。

html javascript web-component custom-element native-web-component

4
推荐指数
1
解决办法
2090
查看次数

Web 组件访问connectedCallBack 中的innerHTML

class Form extends HTMLElement {
    constructor() {
        super()

    }
    connectedCallback() {
        console.log(this)
        console.log(this.innerHTML)

    }
}

customElements.define("my-form", Form);
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试访问innerHTML,因为console.log(this)如果我在控制台中展开它,innerHTML 已设置,但当我尝试时console.log(this.innerHTML)它不会记录任何内容。

为什么即使在connectedCallback中我也无法访问我的标签内的任何内容。

最终我想做的是

class Form extends HTMLElement {
    constructor() {
        super()
        
    }
    connectedCallback() {
        let inputCounter = 0
        for (let i of this.querySelectorAll("input")) {
            this[inputCounter] = i
            inputCounter++
        }
    }
}

customElements.define("my-form", Form);
Run Code Online (Sandbox Code Playgroud)

但我不能这样做,因为我无法访问元素内的任何内容。

html javascript web-component

4
推荐指数
1
解决办法
1709
查看次数

将 Google 的 &lt;model-viewer&gt; 与 React/Reagent 集成

Google 的<model-viewer>提供了我需要的所有关键功能,而无需通过类似react-three-fiber或直接在 Three.js 中编写自定义解决方案。

我正在努力解决如何将其正确集成到 Reagent(以及 React)结构中。

为了使其易于与 vanilla JS 一起使用,它被构建为一个 Web 组件,并且主要通过其 html 元素上的属性进行控制。通常这不会是什么大问题,但由于 3D 和加载大型模型重新渲染的开销,这是昂贵的,并且在许多情况下会破坏功能。

我试图天真地在组件内使用它,并试图消除重新渲染的可能性。使用 ref 直接改变它。

我还尝试将其设置为从 Reagent/React 控制的应用程序手动创建的 html 元素,并通过其 dom 元素在各种事件中引用它。

这两个选项都引入了很多技巧,并且在单页应用程序中并不理想。

我想知道是否有人有关于如何最好地将其包装在 React/Reagent shell 中的任何提示,同时仍然可以访问核心元素以使用其底层 JS api。

答案不必在ClojureScript中。


以下是其页面上的用法示例:

<model-viewer 
  alt="Neil Armstrong's Spacesuit from the Smithsonian Digitization Programs Office and National Air and Space Museum" 
  src="shared-assets/models/NeilArmstrong.glb" 
  ar ar-modes="webxr scene-viewer quick-look" environment-image="shared-assets/environments/moon_1k.hdr" 
  poster="shared-assets/models/NeilArmstrong.webp" 
  seamless-poster 
  shadow-intensity="1" 
  camera-controls>
</model-viewer>
Run Code Online (Sandbox Code Playgroud)

感谢您的任何提示。


关于Clojurians Slack 的其他讨论(链接需要访问 Slack)

关于Clojureverse的附加讨论

web-component clojurescript reactjs reagent re-frame

4
推荐指数
1
解决办法
6548
查看次数

模型不会在Angular 2无线电列表中更新

我正在尝试构建一个Angular 2组件,它显示带有无线电的选项列表.它工作正常,但是当选择其中一个选项时,answer组件的字段(内部绑定[(ng-model)]="answer")将不会更新.我做错了什么,或者这不是创建无线电选择列表的方法吗?

  <div>
    Answer: {{ answer }}
  </div>
  <div class="radio" *ng-for="#option of itemData">
      <label>
          <input type="radio" [value]="option.id" [(ng-model)]="answer"
                 (change)="responseChanged()" name="radio-list">
          <span>{{ option.name }}</span>
      </label>
  </div>
Run Code Online (Sandbox Code Playgroud)

Plunker

javascript web-component angular

3
推荐指数
1
解决办法
3432
查看次数

聚合物样式:主机[属性]失败

得到了带faded属性的简单组件.

 <template>
      <style>
            :host {
                display: block;
                height: 7em;
                background: white;
                border: 1px solid var(--paper-blue-grey-50);
                width: 100%;
                margin: 0.1em 0;
            }
            :host ([faded]) {
                display: none;
                background: #eaeaea;
                color: #a8a8a8;
                cursor: auto;
                pointer-events: none;
            }
            .month {
                ...
            }
            .names {
               ...
            }
            .date {
                ...
            }
        </style>

        <div>
            <div class="month" hidden="[[hideMonth]]">[[details.month]]</div>
            <div class="names">
                <span class="date">[[details.date]]</span>
                <div hidden="[[hideName]]">
                    <div>[[details.name]]</div>
                    <div class="highlight annotation"></div>
                </div>
            </div>
        </div>

    </template>

    <script>
        'use strict';
        Polymer({
            is: "calendar-day-short-view",
            properties: {
                date: {
                    type: Object, …
Run Code Online (Sandbox Code Playgroud)

html css css-selectors web-component polymer

3
推荐指数
1
解决办法
1602
查看次数

Polymer 2.0:通知并反映属性

我是这个框架的新手,很想看到一些有用而简单的通知和反映属性属性的例子.请保持示例简单或为您提供的任何代码添加说明.

web-component polymer

3
推荐指数
1
解决办法
1750
查看次数

为自定义元素加载polyfill的最佳方法是什么?

我正在玩自定义元素.我很难找到缺乏支持的polyfill浏览器的正确方式(或者感觉正确的方式)(看似只有Firefox?).

我目前正在做以下事情:

if ('customElements' in window) {
    var e = document.createElement('script');
    e.src = '/static/elements/my-element.js';
    document.body.appendChild(e);   
} else {
    var e = document.createElement('script');
    // customElements
    e.src = 'https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.0.8/webcomponents-sd-ce.js';
    e.onload = function() {
        var c = document.createElement('script');
        // ShadyCSS
        c.src = '/static/js/custom-style-interface.min.js';
        c.onload = function() {
            var i = document.createElement('script');
            i.src = '/static/elements/my-element.js';
            document.body.appendChild(i);
        }
        document.body.appendChild(c);
    }
    document.body.appendChild(e);
}
Run Code Online (Sandbox Code Playgroud)

这可行,但显然效率极低(特别是在慢/高延迟网络上),而且看起来非常嘈杂.在尝试支持Firefox之前,我可以做到:

<script src="/static/elements/my-element.js"></script>
Run Code Online (Sandbox Code Playgroud)

现在我上面有这种憎恶.必须有一个更好的方法,但我似乎找不到一个.

如何确保customElement和ShadyCSS polyfill之前运行my-element.js而不会延迟下载量?任何指针都非常感谢!

编辑: 现在我正在使用另一种方法,我将在这里添加.我不认为它是完美的,但似乎比我的第一种方法更好或强迫每个人下载polyfills无论他们是否需要它们.

function insertScript(url, downloadAsync) {
    const script = document.createElement('script');
    document.head.appendChild(script);
    script.async = downloadAsync;
    script.src …
Run Code Online (Sandbox Code Playgroud)

javascript web-component polyfills shadow-dom custom-element

3
推荐指数
1
解决办法
381
查看次数

Babel 7:Function.prototype.toString:“此”不是Function对象

我想创建应该在ie11上运行的Web组件。我正在用gulp(和gulp-babel,其中包括babel 7)编译js。

到目前为止,当我使用Babel进行编译时,它可以在Chrome中运行,但是会在ie11:中发送错误Function.prototype.toString: 'this' is not a Function object

在gulpfile.js中,我有这个:

.pipe(babel({
    "presets": [
        ["@babel/preset-env", {
            "targets": {
                "browsers": [
                    "Chrome >= 52",
                    "FireFox >= 44",
                    "Safari >= 7",
                    "Explorer 11",
                    "last 4 Edge versions"
                ]
            }
        }]
    ]
}))
Run Code Online (Sandbox Code Playgroud)

在js中,我有类似这样的内容(我在网上找到了用于测试的示例代码):

class MyCustomTag extends HTMLElement {
    connectedCallback() {
        this.innerHTML = '<h2>My custom element</h2><button>click me</button>';
        this.style.backgroundColor = 'blue';
        this.style.padding = '20 px';
        this.style.display = 'inline-block';
        this.style.color = 'white';
    }
}

try {
    customElements.define('my-custom-tag', MyCustomTag)
} catch (err) {
    const h3 …
Run Code Online (Sandbox Code Playgroud)

javascript babel web-component gulp gulp-babel

3
推荐指数
1
解决办法
1870
查看次数