Skip to content

Instantly share code, notes, and snippets.

@rjchatfield
Created September 26, 2019 03:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rjchatfield/8702351c4033d85ec5b18010cc21b185 to your computer and use it in GitHub Desktop.
Save rjchatfield/8702351c4033d85ec5b18010cc21b185 to your computer and use it in GitHub Desktop.
ComponentsWithRenderProps
const ComponentsWithRenderProps = () => (
<ComponentA value={'Value'}>
{({ data, doSomethingWithComponentA }) => (
<ComponentB value={'B-value'}>
{something => (
<ComponentC
data={data}
something={something}
onAnotherThing={doSomethingWithComponentA}
/>
)}
</ComponentB>
)}
</ComponentA>
);
import SwiftUI
func ComponentsWithRenderProps() -> some View {
ComponentA(value: "Value") { (data, doSomethingWithComponentA) in
ComponentB(value: "B-value") { (something) in
ComponentC(
data: data,
something: something,
onAnotherThing: doSomethingWithComponentA
)
}
}
}
/// No idea about ComponentB or C
struct ComponentA<RenderProp: View>: View {
@State var value: String
let renderProp: (Data, @escaping (String) -> Void) -> RenderProp
var body: some View {
renderProp(value.data(using: .ascii)!, { self.value = $0 })
}
}
/// No idea about ComponentA or C
struct ComponentB<RenderProp: View>: View {
@State var value: String
let renderProp: (String) -> RenderProp
var body: some View {
renderProp(value)
.onAppear { self.value = "B didAppear" }
.onDisappear { self.value = "B didDiappear" }
}
}
/// No idea about ComponentA or B
struct ComponentC: View {
let data: Data
let something: String
let onAnotherThing: (String) -> Void
var body: some View {
EmptyView()
}
}
let v = ComponentsWithRenderProps().body.body
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment