콘텐츠로 이동

생명주기 훅

요소의 생명주기에 콜백을 다는 순수 팩토리 셋입니다. 새 브랜드도, 새 디스패치 개념도 없습니다 — 돌려주는 값은 각각 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 모듈 경로>).QuadRoblox
local 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*'

시그니처

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에서 채워짐)을 그대로 합니다.

동작 — 프로퍼티·자식·이벤트 어느 것보다 먼저 불립니다. 그래서 인스턴스가 아직 아무것도 설정되지 않은 상태로 넘어옵니다 — 초기 상태를 바꾸거나 바깥 레지스트리에 등록하는 자리입니다.

시그니처

OnRendered: <I>(fn: (inst: I, ref: PostRef<I?>) -> ()) -> PostRef<I?>

반환PostRef<I?>.

동작 — 자기 서브트리가 완성된 뒤 불립니다. 자식 인스턴스들이 이미 붙어 있으므로, 자식을 세거나 자기 아래를 훑는 작업이 여기서 안전합니다.

시그니처

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