如何使用 litElement 获取另一个组件中的组件状态更改?

2024-02-17

我开始了一个项目基于光元素 https://lit-element.polymer-project.org/有许多组件相互嵌套,假设我们有这样的结构:

根组件是my-app

import { LitElement, html, customElement, query } from 'lit-element';
import './my-form';
import './my-view';
import { MyView } from './my-view';

@customElement('my-app')
export class MyApp extends LitElement {
  @query('my-view') private myView?: MyView;

  private handleCountChange(e: CustomEvent<{ count: number }>) {
    if (!this.myView) throw 'my-view not found!';
    this.myView.count = e.detail.count;
  }

  render() {
    return html`
      <my-form @countChanged=${this.handleCountChange}></my-form>
      <my-view></my-view>
    `;
  }
}

如您所见,我们有两个组件: my-form

import { LitElement, html, customElement, property } from 'lit-element';

@customElement('my-form')
export class MyForm extends LitElement {
  @property({ type: Number }) count: any = 0;

  private updateCount(e: KeyboardEvent) {
    this.count = (<HTMLInputElement>e.target).value;
    this.dispatchEvent(
      new CustomEvent('countChanged', {
        composed: true,
        bubbles: true,
        cancelable: true,
        detail: { count: this.count }
      })
    );
  }

  render() {
    return html`
      <input value=${this.count} @input=${this.updateCount} type="text" />
    `;
  }
}

和我的观点:

import { LitElement, html, customElement, property } from 'lit-element';

@customElement('my-view')
export class MyView extends LitElement {
  @property({ type: Number }) count: number = 0;

  render() {
    return html`
      <p>${this.count}</p>
    `;
  }
}

为了获得财产count变化自my-form into my-view我调度了事件侦听器然后将其用于my-app然后在handleCountChange我正在分配count价值MyView除了将其作为组件导入之外,还作为类导入。

目前,这是可行的,但我觉得还有很长的路要走,特别是当我有更多的嵌套组件时。我想知道是否有更好的方法可以做到这一点。 有没有类似的东西Context API存在于react.js我想过使用redux但有人不推荐它与 litElemnt 一起使用。 我正在考虑的想法之一是将事件分派给document而不是当前的组件,但这也许是一个不好的做法!您有什么建议,请告诉我?


您可能已经解决了这个问题,但我可以向您发送我将如何处理这个问题。

您需要将您的状态提升到您的状态my-app成分。该状态将成为单一事实来源并提供count价值my-form and my-view子组件。

In my-app组件,您可以更改handleCountChange像这样的东西(以防万一,如果你定义count作为一个属性并让my-app从属性接收初始值):

 private handleCountChange(e: CustomEvent<{ count: number }>) {
   this.setAttribute('count', count); // If you set `count` as observed attribute, you will not need to call `requestUpdate` method
 }

或者像这样,如果你定义count作为阶级财产

 private handleCountChange(e: CustomEvent<{ count: number }>) {
   this.count = count;
   this.requestUpdate(); // force to call render method which is necessary in this case
 }

请注意,您必须发送count也具有价值my-form成分。没有它它也可以工作,但如果你这样做,你将失去你的状态的单一真相来源,这可能会导致潜在的意外行为。

如果您需要发送示例,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 litElement 获取另一个组件中的组件状态更改? 的相关文章

随机推荐

  • 我使用的是哪个版本的 Objective-C?

    我如何知道什么版本Objective C我在用着 我正在使用带有 xCode 的 Mac 我之所以问这个问题是因为我有一本书 Objective C 3 0 并且它说你可以像这样声明一个多维数组 int num 新 int 2 2 当我尝试
  • jquery scrollpane ms ajax updatepanel 回发后不起作用

    我收到了一个网站的新设计 设计者在设计中使用了jquery 我正在将设计实现到 ASP NET Ajax 应用程序中 但我遇到了一个问题 我有一个带有更新面板和菜单的页面 单击菜单项时 用户控件将动态加载到更新面板上的占位符中 这使得页面没
  • MVC 站点地图提供程序和本地化

    今天我发现 对于我的网站 我可以使用从 Github 下载的适用于 MVC3 的 SiteMap 提供程序 因为我的 Web 应用程序是 MVC3 情况如下 我的申请是多语言的 我有一个单独的图书馆 其中包含所有资源 然后这个库被添加到我当
  • 重命名 ASP.NET Core Razor Pages 中的页面/共享目录

    我正在使用 ASP NET Core 5 Razor 页面 通用模板进去Pages Shared 但我需要将其重命名为Pages Foo 如何指示运行时查找文件Pages Foo 我认为这是可能的Startup ConfigureServi
  • OpenShift 上的 WebSocket 不适用于远程客户端

    我有一个无法解决的问题 我使用 socket io 或 WebSockets Node js 库在 openshift 卡带上实现了 Node js WebSockets 服务器 对于其中任何一个 结果都是相同的 使用在同一 openshi
  • 函数和子程序有什么区别?

    函数和子程序有什么区别 有人告诉我函数和子程序之间的区别如下 函数接受参数 在本地工作 不会改变任何值或使用其范围之外的任何值 高内聚 它还返回一些值 子例程直接使用调用者或调用它的代码段的值 并且不返回值 低内聚性 即将某些代码分支到其他
  • 如何在 whoosh 中使用 n 元语法

    我正在尝试使用 n grams 来使用 Whoosh 进行 自动完成式 搜索 不幸的是我有点困惑 我做了一个这样的索引 if not os path exists index os mkdir index ix create in inde
  • 如何使用 Nuxt Auth 模块在 Vuex 中重新获取用户?

    简短的问题 是否可以通过 Nuxt Auth 模块手动更新 Vuex 中的用户数据 为什么我有这个问题 我的问题是这样的 我在用户文档中的 MongoDB 中保存了一些点赞 关注 我的认证是用Nuxt Auth实现的 Nuxt Auth 在
  • Angular UI Router - 允许任何查询字符串参数

    我正在使用 Angular UI Router 这在大多数情况下都运行良好 但是 我遇到了一种情况 我事先不知道查询字符串参数的名称 因此 通常使用 UI 路由器 您会定义如下所示的路由 stateProvider state test u
  • 如何解决超出纳秒范围的问题[重复]

    这个问题在这里已经有答案了 LastLogin LastPurchased 2018 08 21 00 28 04 081677 0001 01 01 00 00 00 2018 08 21 00 28 58 209522 2018 08
  • Javax.net.ssl.SSLHandshakeException:javax.net.ssl.SSLProtocolException:SSL 握手中止:SSL 库失败,通常是协议错误

    我正在尝试在android中运行以下代码 URLConnection l connection null Create connection uzip new UnZipData mContext l url new URL serveru
  • Postgresql WHERE 与age() 函数[重复]

    这个问题在这里已经有答案了 我很确定以前有人问过这个问题 但我正在努力为包含类似数据的表获取正确的语法 id date type report item id 1 2018 11 07 Ver ffentlichung des 9 Mona
  • 在不同片段之间导航时,BottomSheet 不会隐藏

    你好 我有一个bottomsheet使用一些文本视图 作为按钮 按下时它会导航到不同的片段 但问题是当textView被按下并导航到片段仍然底部工作表没有隐藏 最终必须点击屏幕才能隐藏底部工作表 我希望当片段启动时底部工作表将隐藏 这是我遇
  • 惰性和函数组合(haskell、erlang)

    有人可以解释或提供一些关于函数组合如何与惰性相关的资源吗 例如如何filter W map toUpper justaword 在 Haskell 中工作与在 erlang 中的对应工作相比 后者并不懒惰 每次需要另一个字符 或结束通知 时
  • 文件从哪里/如何填充到 /var/www/html 中?

    我正在学习 Docker 并试图理解volumes 看看这个例子WordPress 撰写 https docs docker com compose wordpress define the project和它的docker文件 https
  • 如何使内容显示在固定 DIV 元素下方?

    我的目的是在页面顶部创建一个菜单 即使用户滚动 该菜单也保留在页面顶部 例如 Gmail 最近的功能 其中常用按钮随用户向下滚动 以便允许他们执行对消息进行操作而无需滚动到页面顶部 我还想将所述菜单下方的内容设置为显示在其下方 目前 它显示
  • 如何访问 C++ Eigen 数组中的多个元素?

    我想检索特征数组中的某些元素并将它们作为向量返回 我使用以下代码 Eigen ArrayXXi test test resize 5 5 test setRandom Eigen Matrix
  • 如何提高 SQL Server 中日期时间过滤的性能?

    我在过滤时遇到问题datetime列 我尝试了这两种方法 datefield lt 2013 03 15 17 17 55 179 datefield lt CAST 2013 03 15 17 17 55 179 AS datetime
  • 监听 JFreeChart 中的缩放重置事件

    如何监听 JFreeChart 的缩放重置事件 我用这个做到了 ChartPanel DCP new ChartPanel DailyChart Override public void restoreAutoBounds super re
  • 如何使用 litElement 获取另一个组件中的组件状态更改?

    我开始了一个项目基于光元素 https lit element polymer project org 有许多组件相互嵌套 假设我们有这样的结构 根组件是my app import LitElement html customElement