When creating a List view onAppear triggers for elements in that list the way you would expect: As soon as you scroll to that element the onAppea
List
onAppear
onAppea
As per SwiftUI 2.0 (XCode 12 beta 1) this is finally natively solved: In a LazyHStack (or any other grid or stack with the Lazy prefix) elements will only initialise (and therefore trigger onAppear) when they appear on screen.
LazyHStack