请考虑以下swiftUI方案:
const buttons = document.querySelectorAll('button');
for (const button of buttons) {
console.log(buttons[0].value);
button.onmouseenter = () => {
console.log(buttons);
const drop = document.createElement('div');
const pe = (p) => {
const text = document.createElement('p');
text.innerText = p;
drop.appendChild(text);
}
pe('comedy and romence');
pe('mystrey');
drop.style.width = '190px';
drop.style.height = '130px';
drop.style.display = 'grid';
drop.style.placeItems = 'center';
drop.style.border = '0px';
drop.style.borderRadius = '25px';
drop.style.backgroundColor = 'rgba(0, 200, 157, 0.2)';
drop.style.animation = 'move 300ms ease-in-out forwards';
button.appendChild(drop);
button.onmouseleave = () => {
button.removeChild(drop);
}
}
}
其中List {
ForEach(manager.items(filter: .all), id: \.id) { item in
RowView(item: item)
}
}
是通过manager
注入的环境对象。 @EnvironmentObject var manager: Manager
方法返回根据过滤器参数获取的核心数据实体的数组。这对于更改元素非常有效,但是无论何时添加或删除元素,都不会通知ForEach视图(当然,因为它是函数返回的,并且没有“绑定”等)。
这是bes实践的方法来相应地更新列表吗?我可以以某种方式包装函数调用吗?或通知更改?任何提示,不胜感激!
答案 0 :(得分:0)
我不确定这与核心数据提取的行为以及表现如何有关,但是您可以尝试像这样绑定您的提取结果:
//...
private var items: Binding<[ItemType]> { Binding (
get: { self.manager.items(filter: .all) },
set: { _ in }
)}
var body: some View {
List {
ForEach(self.items, id: \.id) { item in
RowView(item: item)
}
}
//...
或者:
List {
ForEach(self.items.wrappedValue, id: \.id) { item in
RowView(item: item)
}
}
在Swift 5.3中,可以省略对self.
的引用。
答案 1 :(得分:-1)
Manager.items应该标记为@Published。
https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-environmentobject-property-wrapper