你好,我在我的symfony项目中有一个刺激代码。这个代码调用了一个rest API,它需要大约3秒的时间来提供响应。这个rest API返回JSON。
这是我的代码:
import {Controller} from "@hotwired/stimulus";
import axios from "axios";
export default class extends Controller {
static values = {
url: String
}
connect() {
axios.get(this.urlValue)
.then((r) => {
if (r.data !== null) {
let html
const tmp = JSON.parse(r.data)
if (tmp === null) {
html = document.createElement("div")
html.classList.add("alert", "alert-danger", "alert-dismissible", "fade", "show")
html.innerHTML += "Asset Number Not Valid";
html.innerHTML += "<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>"
} else {
html = document.createElement("ul")
html.classList.add("list-group")
for(let key in tmp) {
html.innerHTML += "<li class=\"list-group-item\">" + key + " : " + tmp[key] + "</li>";
}
html.innerHTML += "</ul>";
}
this.element.replaceWith(html);
}
})
}
}
正如你所看到的,它正在构建一个列表或者显示一个错误。这段代码真的很简单,而且运行得很好。我只是不喜欢html的构建方式。
你有其他更干净的方法吗?
2条答案
按热度按时间nue99wik1#
下面是一种不同的方法,基本上是利用HTML Template元素将所有HTML移回到HTML文件中。
当您在Stimulus控制器中构建太多HTML时,它可能会变得很混乱,而不是考虑目标的力量,因为它能够针对任何元素,包括模板,甚至是您动态添加的东西。
控制器
template
目标,在注入时将其用作复制基础。error
和item '目标名称,以便能够轻松删除任何错误或添加的项。results
目标将包含注入的结果(项目模板)。innerText
而不是innerHtml
。HTML格式
template
元素,可以为error
和item
部分设置任何想要的HTML。template
元素的目标名称以template
结尾ul
始终位于DOM中,但如果其中没有项,则可以使用css:empty
默认隐藏它。有用链接
7rtdyuoh2#
您可以在connect方法下面的分隔函数中创建HTML,例如:
然后作为回应,您只需呼叫:
成功的响应也是一样的,所以在最后的响应中,你可以用
this.errorMessage()
或者this.appendList()
,或者你想用什么来调用你的函数。