Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >LitElement维护内部状态

LitElement维护内部状态
EN

Stack Overflow用户
提问于 2020-06-26 11:56:09
回答 1查看 271关注 0票数 0

我正在尝试用LitElement构建一个图表。图表从用户获取数据属性,并显示此数据(图表图)。它还从数据中获取系列名称,以便为每个系列显示一个带有复选框的图例,这些复选框可用于在图表绘图上显示或隐藏该系列的数据。

下面是一个非常小的示例,其中图表图只是包含数据点(3,5,4,7)的div,而图例只是复选框。预期的行为是,当复选框被选中/取消选中时,图表图(data Div)中的相应数据将被显示/隐藏。例如,最初默认选中这两个复选框,并且两个系列的数据都正确显示。但是,如果我取消选中第一个复选框,我希望隐藏"series1“的数据,因此只显示5和7。

正是这种复选框行为让我无法正常工作。当我选中或取消选中某个复选框时,我将看似已正确更新的this.series记入日志,反映选中了哪些复选框,但图表图(data Div)未更新。

代码语言:javascript
运行
AI代码解释
复制
import { LitElement, css, html } from "lit-element";
import { render } from "lit-html";

class TestElement extends LitElement {
  static get properties() {
    return {
      data: { type: Array },
      series: { type: Array },
    };
  }

  constructor() {
    super();
    this.data = [];
    this.series = [];
  }
  checkboxChange(e) {
    const inputs = Array.from(this.shadowRoot.querySelectorAll("input")).map(n => n.checked);
    this.series = this.series.map((s, i) => ({ ...s, checked: inputs[i] }));
    console.log("this.series", this.series);
  }
  render() {
    this.series = Object.keys(this.data[0]).map(key => ({ key, checked: true }));
    const data = this.data.map(d => this.series.map(s => (s.checked ? html`<div>${d[s.key]}</div>` : "")));
    const series = this.series.map(
      s => html`<input type="checkbox" ?checked=${s.checked} @change=${this.checkboxChange} />`
    );
    return html`${data}${series}`;
  }
}
customElements.define("test-element", TestElement);

render(
  html`<test-element
    .data=${[
      { series1: "3", series2: "5" },
      { series1: "4", series2: "7" },
    ]}
  ></test-element>`,
  window.document.body
);
EN

回答 1

Stack Overflow用户

发布于 2021-04-17 18:13:55

尝试以下操作:

代码语言:javascript
运行
AI代码解释
复制
import { LitElement, html } from 'lit-element';

class TestElement extends LitElement {
  static get properties() {
    return {
      data: { attribute: false, accessors: false },
      series: { attribute: false, accessors: false },
      checked: { attribute: false, accessors: false },
    };
  }

  constructor() {
    super();
    this.data = [];
    this.series = new Map();
    this.checked = new Map();
  }

  get data() {
    return this.__data || [];
  }

  set data(v) {
    const oldValue = this.__data;
    this.__data = Array.isArray(v) ? v : [];
    this.series = new Map();

    for (const row of this.data) {
      for (const [series, value] of Object.entries(row)) {
        this.series.set(series, [...this.series.get(series) || [], value])
      }
    }

    for (const series of this.series.keys()) {
      this.checked.set(series, this.checked.get(series) ?? true);
    }

    this.requestUpdate('data', oldValue);
    this.requestUpdate('series', null);
    this.requestUpdate('checked', null);
  }

  checkboxChange(e) {
    this.checked.set(e.target.dataset.series, e.target.checked);
    this.requestUpdate('checked', null);
  }

  render() {
    return [
      [...this.series.entries()].map(([series, values]) => values.map(value => html`
        <div ?hidden="${!this.checked.get(series)}">${value}</div>
      `)),
      [...this.checked.entries()].map(([series, checked]) => html`
        <input type="checkbox" ?checked=${checked} data-series="${series}" @change=${this.checkboxChange} />
      `)
    ];
  }
}

customElements.define("test-element", TestElement);

现场示例:https://webcomponents.dev/edit/FEbG9UA3nBMqtk9fwQrD/src/index.js

此解决方案提供了一些改进:

  1. 在数据更新时缓存序列和选中状态,而不是在每个呈现属性时使用hidden attr隐藏未选中的序列
  2. 使用data-attributes将集合项上的可序列化数据传递到event attributes attribute: false而不是type: Array (假设您不需要从属性反序列化D13。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62594225

复制
相关文章
vue笔记2 -过滤器,v-­text ,v-­html ,v­-bind,v-on指令
Vue. 支持在{{}}插值的尾部添加一小管道符 “ | ” 对数据进行过滤, 经常用于格式化文本,比如字母全部大写、货币千位使用逗号分隔等。
bamboo
2019/01/29
1.4K0
vue笔记2 -过滤器,v-­text ,v-­html ,v­-bind,v-on指令
Vue3 script-setup 使用指南
本文主要是讲解 <script setup> 与 TypeScript 的基本使用。
ConardLi
2022/02/18
5.8K0
flask flask-script自定义指令(flask 50)
from flask import Flask,render_template from views.admin import admin_bp from views.auth import auth_bp from views.blog import blog_bp from settings import config from extensions import bootstrap,db,login_manager,csrf,ckeditor,mail,moment,toolbar,migrate import os from flask_wtf.csrf import CSRFError from fakes import fake_admin, fake_categories, fake_posts, fake_comments from flask_script import Manager
用户5760343
2019/08/14
3430
(三)setup 中定义响应性数据
setup 中定义响应性数据 在setup 中编写响应性数据 // vue 给我们提供了定义响应性数据的方法 ref() reactive() computed() ... // 我们也把他叫做状态 // 通过ref 包装之后,数据就变成响应性数据了,如果包装的是一个对象,他里面的所有数据也都是响应的 cosnt num = ref('0') // 通过ref 定义的数据,返回的是一个对象,需要通过.value的形式来访问 console.log(num.value) // 如果使用 ref 来判断一
老怪兽
2023/02/22
2920
Vue3 Script Setup速查表
前端小智@大迁世界
2023/08/16
1720
Vue3 Script Setup速查表
初识 vue3 之单文件组件 script setup
<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。相比于普通的 <script> 语法,它具有更多优势:
Qwe7
2022/01/30
1.8K0
Vue3中如何使用自定义指令?
Vue是一款流行的JavaScript框架,它提供了许多强大的功能来简化前端开发。其中一个重要的特性就是自定义指令。Vue3作为Vue的最新版本,在自定义指令的功能上有了一些改进和新增的特性。本文将详细介绍Vue3中如何使用自定义指令,包括创建指令、钩子函数、指令修饰符等方面。
网络技术联盟站
2023/07/05
4550
Angularjs进阶笔记(2)-自定义指令中的数据绑定
自定义指令,是Angularjs用来实现组件化的方式,相比于React和Vue的组件化方式,它真的很复杂,自定义指令太重了,它暴露了太多可供定制的参数,以至于普通的开发者完全不知道要用它来做什么而将其束之高阁,毕竟一般的业务逻辑通过controller和service就已经可以完成了。
大史不说话
2019/03/01
2.1K0
script在head和在body中的区别
加载的顺序不一样,html是从上往下加载的。如果在网速慢的情况下把js代码放在body底部用户会先看到网页结构,等js加载完成后才出现特效。
用户1349575
2022/02/08
3K0
使用element_text在ggplot2中自定义文本
ggplot2的主题系统可以让我们更好的控制图形 非数据元素 的细节,通过更加精细的修改来提升图像的美感,ggplot2 的主题系统自带多个 element_ 功能
前端小tips
2021/12/06
2.6K0
使用element_text在ggplot2中自定义文本
Daily Script2
#参数推荐pt-variable-advisor 192.168.1.123 --user root --password abc# mysql 信息汇总pt-mysql-summary --user root --password abc# mysql 参数对比pt-config-diff h=192.168.1.123 h=192.168.1.178 --user=abc --password=abc# mysql 参数调整./mysqltuner.pl --forcemem 48288 --force
franket
2022/07/09
5710
(九)setup中的methods和Emit 自定义事件
因为 methods 本来就是普通的 javaScript 函数,所以可以直接在 setup 中定义
老怪兽
2023/02/22
5950
手把手教你在 Vue3 中自定义指令
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。 ---- TienChin 项目前端是 Vue3,前端有这样的一个需求:有一些前端页面上的按钮要根据用户的权限来决定是否展示出来,如果用户具备相应的权限,那么就展示对应的按钮;如果用户不具备对应的权限,那么按钮就隐藏起来。大致上就这样一个需求。 看到这个需求,可能有小伙伴首先想到用
江南一点雨
2022/07/26
5910
手把手教你在 Vue3 中自定义指令
项目前端是 Vue3,前端有这样的一个需求:有一些前端页面上的按钮要根据用户的权限来决定是否展示出来,如果用户具备相应的权限,那么就展示对应的按钮;如果用户不具备对应的权限,那么按钮就隐藏起来。大致上就这样一个需求。 看到这个需求,可能有小伙伴首先想到用 v-if 指令,这个指令确实也能做,但是,由于用户具备的权限一般来说可能是多个,甚至可能还有通配符,所以这个比对并不是一个容易的事情,肯定得写方法。。。所以,如果能用一个指令来实现这个功能,那么就会显得专业很多了。 说干就干,我们来看看 Vue3 中如何自定义指令。
PHP开发工程师
2022/07/26
7090
Vue全局指令:如何添加全局指令?(附2个常用自定义指令)
前面有专门的文字,讲过Vue指令,以及如何使用指令,今天就来讲讲如何添加全局指令,并且附上2个非常适用的例子。
Javanx
2019/09/04
3.5K0
Vue全局指令:如何添加全局指令?(附2个常用自定义指令)
用这5个技巧将你的Vue技能提升到新的高度
在这篇文章中,我们将探讨五个实用的 Vue 技巧,这些技巧可以使你日常使用 Vue 编程更高效、更富有成效。无论你是Vue的初学者还是经验丰富的开发者,这些技巧都能帮助你编写更清晰、更简洁、更有效的代码。那么,让我们开始吧。
前端小智@大迁世界
2023/08/16
2660
初探 vite2 + vue3 vite2 构建项目:安装第三方控件script setup
vite2已经出来一段时间了,这几天没忍住尝试了一下,首先体验到的就是 —— 快,真的很快,再也不用痛苦的等待了。
用户1174620
2021/04/13
1.7K0
Angular2 中的指令
组件:一种带有模板的指令;使用component来装饰组件类 属性指令:改变元素的外观或行为,如NgClass,NgStyle;使用Directive来装饰指令类 结构指令:向DOM中添加或删除元素,如NgIf,NgFor;使用Directive来装饰指令类
用户1437675
2018/08/20
1.8K0
Vue专题 03_那些年你见没见过的指令(v-?)
Vue中有很多的指令,且形式都是:v-???? 我在这里总结了12个常见指令,顺序如下:v-on、v-bind、v-model、v-for、v-show、v-if、v-else/v-else-if、v
用户9999906
2022/09/26
2.3K0
flask 通过flask-script生成指令(flask 36)
from flask import Flask from flask_bootstrap import Bootstrap from flask_moment import Moment from flask_sqlalchemy import SQLAlchemy from flask_script import Manager
用户5760343
2019/08/13
7300

相似问题

带子查询的Django分组查询集

11

Linq group by带子分组

21

带子查询的子句与id分组连接的错误1054

21

带子查询的子句中使用的非分组字段

13

用带子句的甲骨文分组

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文