我正在尝试使用Webpack
和Web Component
创建tic-tac-toe game
。
我需要在place-mark
组件的shadowRoot
中选择一个具有cell
类的div
标记,然后根据另一个函数计算的Turn将innerText
更新为O/X。
逻辑工作正常,但我无法选择正确的组件来更新HTML视图,因此用户可以看到所选区域的当前状态。
下面是我的简化HTML代码:
<div class="board" id="board">
<place-mark data-cell></place-mark>
</div>
字符串
下面是我的简化组件代码:
const template = document.createElement("template");
template.innerHTML = `<div class="cell" />`;
export default class PlaceMark extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "open" });
this.shadowRoot.appendChild(
template.content.cloneNode(true)
);
}
}
window.customElements.define(
"place-mark",
PlaceMark
);
型
以下是我的简化JS代码:
const X_CLASS = "x";
const CIRCLE_CLASS = "circle";
const cellElements = document.querySelectorAll('[data-cell]');
const board = document.getElementById("board");
let circleTurn;
function startGame() {
cell.addEventListener("click", handleClick, { once: true });});
}
function handleClick(e) {
const cell = e.target;
const currentClass = circleTurn
? CIRCLE_CLASS
: X_CLASS;
placeMark(cell, currentClass);
if (checkWin(currentClass)) {
endGame(false);
} else if (isDraw()) {
endGame(true);
} else {
swapTurns();
setBoardHoverClass();
}
}
function placeMark(cell, currentClass) {
cell.classList.add(currentClass);
}
型
如果你需要上面的代码的完整版本,这里是我的项目:
https://github.com/nazaninsnr/TicTacToe
2条答案
按热度按时间iqjalb3h1#
你可以简单地从代码中删除
shadowRoot
它会给你给予机会去访问所有的元素和你想要的
querySelect
。字符串
brjng4g32#
全局
querySelector
代码可以不访问shadowRoots内的DOM内容。如果你有一个
open
shadowRoot,你可以做:document.querySelector("my-component").shadowRoot("[data-cell]")
个当你有nestedshadowRoots时,这当然会变得很麻烦。
您可能需要将逻辑更改为:
下面是工作流程:
tileclicked
事件<my-board>
侦听此事件colortile
*所有9个磁贴监听
colortile
事件字符串
Playground:https://jsfiddle.net/WebComponents/Lk9r4gx2/
备注:
<my-tile>
上设置shadowDOM;然后<my-board>
STYLE可以设置所有tile的样式。getRootNode()
然后 escape shadowRoot,并找到closest("my-board")
console.log
进行实验,以了解事件如何重新定位,然后composedPath
保存您的.detail:{}
属性包中传递一个Functionreference...这样Tile就可以访问Board上的方法,反之亦然。