【发布时间】:2023-02-22 03:30:42
【问题描述】:
在代码 sn-p 中,如果您单击选择按钮,它会呈现一个带有按钮的 div 我试图在单击按钮时删除该 div。
这就是代码的流程。在 SelectedBtn 组件 handleSelect 中,一个对象被创建并被推送到 window.selectedItems.items。
对所选产品调用下一次渲染。然后在 DeleteButton 组件 render 中调用 forEach over this.items 存储在构造函数中。
然后将 innerHTML 设置为带有嵌套删除按钮的 div 与数据一起呈现(我想删除整个 div 并重新呈现)
用户单击删除按钮并触发 handleDelete,它从事件中获取 id 并存储在 let 中。接下来,我在 this.items 上调用过滤器。
如果您查看日志,它会将其从数组 this.items 中删除,但不会重新呈现。
class DeleteButton extends HTMLElement {
constructor() {
super();
this.items = window.selectedItems.items;
this.selectedProducts = document.querySelector('selected-products');
this.querySelectorAll('button').forEach((button) => button.addEventListener('click', this.handleDelete.bind(this)));
}
// This is what I have tried
handleDelete(e) {
e.preventDefault();
let productId = e.currentTarget.dataset.id;
console.log( productId )
// This is removing the item
this.items.filter((item) => item.id !== productId);
console.log('Before', this.items);
console.log('After filter', this.items.filter((item) => item.id !== productId));
// If I call render below just
this.selectedProducts.render()
}
}
customElements.define('delete-button', DeleteButton);
class SelectedProducts extends HTMLElement {
constructor() {
super();
this.items = window.selectedItems.items
}
render() {
this.items.forEach((item, index) => {
this.innerHTML = `
<div style="display:flex; align-items: center; background-color:white; padding:15px; ">
<delete-button>
<button data-id="${item.id}" class="delete-btn">
Delete me
</button>
</delete-button>
</div>
`;
});
}
}
customElements.define('selected-products', SelectedProducts);
class ProductCard extends HTMLElement {
constructor() {
super();
this.attachShadow({
mode: 'open',
});
this.shadowRoot.innerHTML =
`<style>
::slotted(div){
color: #4B5563;
font-weight: 900;
text-align: center;
font-size: 20px;
}
</style>
` +
` <div style="background: white; margin-right: 15px;">
<slot name="button"></slot>
<slot name="img"></slot>
</div>
`;
}
}
customElements.define('product-card', ProductCard);
class SelectBtn extends HTMLElement {
constructor() {
super();
// This is called with render below
this.itemsPicked = document.querySelector('selected-products');
this.attachShadow({
mode: 'open',
});
this.shadowRoot.innerHTML = `
<button
aria-label="Select"
type="button"
class="pressed"
data-addbtn="add-btn"
>
+
</button>
`;
// this.id = this.getAttribute('id');
// this.name = this.getAttribute('name');
this.shadowRoot
.querySelectorAll('button')
.forEach((button) => button.addEventListener('click', this.handleSelect.bind(this)));
}
// Get data from attributes & store object in
// an array on window object
handleSelect(e) {
e.preventDefault();
const itemObj = {
id: '1',
name: name,
qty: 1,
};
const item_stored = window.selectedItems.items.find((item) => item.id == itemObj.id);
if (item_stored) {
item_stored.qty++;
} else {
window.selectedItems.items.push(itemObj);
}
this.itemsPicked.render();
}
}
customElements.define('select-button', SelectBtn);
<body>
<div style="display: flex; justify-content: center; align-items: center; background: lightblue; padding: 10px">
<product-card>
<div slot="button">
<select-button id="1" name="product name"></select-button>
</div>
<div slot="img">
<div style="height: 100px; width: 100px">Select Button</div>
</div>
</product-card>
<div>
<selected-products></selected-products>
</div>
</div>
<script src="app.js"></script>
<script>
window.selectedItems = {
items: []
};
</script>
</body>
【问题讨论】:
标签: javascript native-web-component