생명주기 훅
요소의 생명주기에 콜백을 다는 순수 팩토리 셋입니다. 새 브랜드도, 새 디스패치 개념도 없습니다 — 돌려주는 값은 각각 PreRef / PostRef / EffectHandle 그 자체이고, children 배열에 그대로 놓입니다.
이 페이지의 심볼: q.OnCreated<<I>>(fn) · q.OnRendered<<I>>(fn) · q.OnDestroyed(fn)
quad-base에 있으므로 백엔드와 무관하게 존재합니다.
-- 설치 경로는 프로젝트 구성에 따라 다르다(00-installation 참고)local Quad = require(<quad-base 모듈 경로>)local QuadRoblox = require(<quad-roblox 모듈 경로>).QuadRobloxlocal q = Quad:UseProvider(QuadRoblox) -- quad-roblox 백엔드 설치: D/Tween/Animate/OnChange가 생긴다local D = q.D공통 계약
섹션 제목: “공통 계약”| 훅 | 반환 | 불리는 시점 |
|---|---|---|
OnCreated(fn) |
PreRef<I?> |
인스턴스가 만들어진 직후, 이 인스턴스에 아무 일도 일어나기 전 |
OnRendered(fn) |
PostRef<I?> |
이 인스턴스의 children(과 그 서브트리 전체)·프로퍼티·이벤트가 전부 세팅된 뒤 |
OnDestroyed(fn) |
EffectHandle |
묶인 인스턴스가 죽을 때 정확히 1회(설치 시점에는 안 돈다) |
- 셋 다 children 배열(해시 키가 아니라 배열 부분)에 놓습니다.
- 여러 번 등록하는 것은 그냥 배열 자리를 여러 개 쓰는 일이고, 같은 종류끼리의 상대 순서는 배열 index 순서입니다. 종류가 섞여 있어도
OnCreated들이 먼저,OnRendered들이 마지막입니다. OnCreated/OnRendered의 콜백은(inst, ref)두 인자를 받고,inst는 항상 non-nil입니다 — 등록 시점의nil호출은 내부 가드가 걸러냅니다.fn이 함수가 아니면 그 줄에서 던집니다:OnCreated: fn must be a function (got number)(이름 자리는 훅마다 바뀝니다).
요소 타입은 명시적 타입 인자로 줄 것
섹션 제목: “요소 타입은 명시적 타입 인자로 줄 것”q.OnCreated<<Frame>>(function(inst) … end) 형태를 쓰십시오. quad-base는 백엔드의 요소 타입을 모르므로 I가 제네릭 자리인데, 콜백 파라미터에 주석을 다는 형태(function(inst: Frame))로는 그 자리가 채워지지 않습니다 — 신 솔버에서 이렇게 죽습니다.
TypeError: Type functions do not currently support types of the form '*error-type*'q.OnCreated<<I>>(fn)
섹션 제목: “q.OnCreated<<I>>(fn)”시그니처
OnCreated: <I>(fn: (inst: I, ref: PreRef<I?>) -> ()) -> PreRef<I?>인자
| 이름 | 타입 | 설명 |
|---|---|---|
fn |
(inst: I, ref: PreRef<I?>) -> () |
인스턴스와 그 PreRef를 받는다 |
반환 — PreRef<I?>. 그 자체가 PreRef이므로 q.isPreRef가 참이고, PreRef가 하는 일(pre-pass에서 채워짐)을 그대로 합니다.
동작 — 프로퍼티·자식·이벤트 어느 것보다 먼저 불립니다. 그래서 인스턴스가 아직 아무것도 설정되지 않은 상태로 넘어옵니다 — 초기 상태를 바꾸거나 바깥 레지스트리에 등록하는 자리입니다.
q.OnRendered<<I>>(fn)
섹션 제목: “q.OnRendered<<I>>(fn)”시그니처
OnRendered: <I>(fn: (inst: I, ref: PostRef<I?>) -> ()) -> PostRef<I?>반환 — PostRef<I?>.
동작 — 자기 서브트리가 완성된 뒤 불립니다. 자식 인스턴스들이 이미 붙어 있으므로, 자식을 세거나 자기 아래를 훑는 작업이 여기서 안전합니다.
q.OnDestroyed(fn)
섹션 제목: “q.OnDestroyed(fn)”시그니처
OnDestroyed: (fn: () -> ()) -> EffectHandle인자 — fn(인자 없는 정리 함수). 반환 — EffectHandle.
동작 — 등록 시점에는 fn이 돌지 않습니다. 묶인 인스턴스가 죽을 때 정확히 한 번 돌고, 그 뒤에 바인딩을 풀어도 다시 돌지 않습니다. children 배열에 놓으면 그 인스턴스에 묶입니다.
제네릭 자리가 없습니다 — 콜백이 인스턴스를 받지 않기 때문입니다.
local function AnimatedBox(): Frame return D.Frame { Size = UDim2.fromOffset(100, 100),
q.OnCreated<<Frame>>(function(inst) print("생성됨:", inst.ClassName) end),
q.OnRendered<<Frame>>(function(inst) print("자기 서브트리 완성:", inst.Size) end),
q.OnDestroyed(function() print("파괴 및 정리됨") end), }end- Ref — 이 훅들이 얹혀 있는
PreRef/PostRef프리미티브 - 네트워크·입력 브리지 — 바깥 연결을 만들고
OnDestroyed로 끊는 배치 - Studio UI 바인딩과 Claim