我刚接触 stimulus,并试图找到正确的模式。我有一组表单项,默认情况下有一个隐藏的提交按钮。当您点击输入时,提交按钮会显示出来。
当您点击其他输入时,先前活动的提交按钮消失,新的提交按钮出现。如果您在所有输入之外点击,则有一个全局的
如果您运行代码片段,它具有我要实现的完全 UX。但是,将全局窗口事件附加到控制器的每个实例似乎过于复杂。此外,每次页面上发生其他操作的点击时都会触发此全局点击。
这种模式在模态上下文中有效,但在我的集合示例中感觉不对。在我的示例中,每次点击都会调用 4 次
当您点击其他输入时,先前活动的提交按钮消失,新的提交按钮出现。如果您在所有输入之外点击,则有一个全局的
data-action="click@window->editor#hideButton"
,用于隐藏提交按钮。如果您运行代码片段,它具有我要实现的完全 UX。但是,将全局窗口事件附加到控制器的每个实例似乎过于复杂。此外,每次页面上发生其他操作的点击时都会触发此全局点击。
这种模式在模态上下文中有效,但在我的集合示例中感觉不对。在我的示例中,每次点击都会调用 4 次
hideButton
函数。即使与页面上的其他元素交互也是如此。
https://discuss.hotwired.dev/t/best-practices-for-handling-clicks-outside-element/1266
我已经阅读了为集合中的每个项目创建控制器是正确的方法。
在刺激措施方面,依靠这一全球事件是正确的方法吗?或者,我应该重新思考整个方法以实现用户体验(意识到我的架构可能有很大偏差)。
const application = Stimulus.Application.start()
application.register("editor", class extends Stimulus.Controller {
static targets = ["button"]
showButton() {
this.buttonTarget.classList.remove("hide")
}
hideButton() {
if (this.element === event.target || this.element.contains(event.target)) return;
this.buttonTarget.classList.add("hide")
}
})
.hide {
display: none;
}
li {
margin: 10px;
background: gray;
width: 230px;
}
input:hover {
cursor: pointer;
}
ul {
list-style: none;
}
<script src="https://unpkg.com/stimulus@2.0.0/dist/stimulus.umd.js"></script>
<ul>
<li data-controller="editor" data-action="click@window->editor#hideButton">
<form>
<label>Item1</label><br>
<input type="text" data-action="click->editor#showButton">
<input class="hide" type="submit" value="Submit" data-editor-target="button">
</form>
</li>
<li data-controller="editor" data-action="click@window->editor#hideButton">
<form>
<label >Item2</label><br>
<input type="text" data-action="click->editor#showButton">
<input class="hide" type="submit" value="Submit" data-editor-target="button">
</form>
</li>
<li data-controller="editor" data-action="click@window->editor#hideButton">
<form>
<label>Item4</label><br>
<input type="text" data-action="click->editor#showButton">
<input class="hide" type="submit" value="Submit" data-editor-target="button">
</form>
</li>
<li data-controller="editor" data-action="click@window->editor#hideButton">
<form>
<label>Item4</label><br>
<input type="text" data-action="click->editor#showButton">
<input class="hide" type="submit" value="Submit" data-editor-target="button">
</form>
</li>
</ul>