상태 관리 방식
응용 프로그램이 상태를 직접 관리할 수도 있고, 컴포넌트가 내부에서 관리하게 할 수도 있습니다.
내부 상태 관리
초깃값만 전달합니다. 이후 상태 변화는 컴포넌트가 처리하며, 변경 알림을 받아 필요한 작업을 할 수 있습니다.
외부 상태 관리
현재 값을 전달하고 변경 알림이 오면 부모에서 새 값을 반영합니다. 저장, 입력 검증, 여러 컴포넌트 사이의 연동이 필요할 때 알맞습니다.
소유 방식은 연결 객체나 컴포넌트를 만들 때 정하고 생명주기 동안 유지합니다. 외부 관리와 내부 관리 사이의 전환은 새 초깃값으로 다시 마운트하거나 연결 객체를 새로 만들어 처리합니다. 이 경계가 대기 중인 제안과 revision의 권한을 분명하게 유지합니다.
여러 상태 필드를 가진 컴포넌트는 필드마다 소유 방식을 따로 정할 수 있지만 각 선택은 생성 시점에 고정됩니다. 외부 관리 상태는 변경 제안을 보낸 뒤 소유자의 update, 컴포넌트별 동기화 함수, 또는 Vue 모델 갱신으로 현재 상태를 확정합니다. domain 변경으로 기존 값의 표현 범위가 달라지면 아래 보정 예외를 적용합니다.
동적 컬렉션 보정
Vue 컬렉션의 domain이 바뀌면 Sectile은 host 연결을 다시 만들기 전에 identity 기반 상태를 보정합니다. 이 동작은 공개 semantic contract입니다.
| 상태 | 보정 방식 |
|---|---|
| 단일 또는 다중 선택 | 새 domain과 겹치는 identity를 새 domain 순서로 유지합니다. 단일 선택은 첫 identity 하나를 유지합니다. |
| 비활성화된 선택 identity | 선택과 기존 값의 소유권을 유지합니다. 비활성 상태는 조작 가능성에만 영향을 줍니다. |
| 현재 또는 강조 identity | 계속 조작할 수 있으면 유지합니다. 대체값은 조작 가능한 선택 identity, 첫 번째로 조작 가능한 domain identity, null 순서로 정합니다. 명시적인 null 강조를 허용하는 컴포넌트는 그 부재를 유지합니다. |
| 트리 펼침 | 현재 branch identity만 유지하고 branch domain 순서를 따릅니다. |
| 그리드 편집 | 보정 과정에서 현재 cell이 제거되면 탐색 상태로 돌아갑니다. |
외부 관리 상태는 보정된 값을 해당 update:* 이벤트로 제안합니다. 컴포넌트는 보정 후보를 즉시 투영해 최신 identity로 host controller를 만들고, 소유권은 응용 프로그램에 유지합니다. 소유자는 제안을 실제 값에 반영해야 합니다. 내부 관리 상태는 같은 후보를 내부에서 채택합니다. 보정 결과는 현재 domain 안의 값으로 구성됩니다.
이 계약은 Accordion, Calendar, Carousel, Combobox, Grid, Listbox, Radio Group, Select, Tabs, Toggle Group, Toolbar, Tree Grid, Tree View에 적용됩니다. Pagination은 별도의 수치 계약을 사용합니다. total이나 itemsPerPage가 바뀌면 외부 관리 page를 새 page count 범위로 제한합니다.
Domain 항목 수를 n, 선택 identity 수를 s, 비활성 identity 수를 d라고 할 때 보정의 시간·보조 공간 복잡도는 O(n + s + d)입니다. Sectile은 각 Vue render에서 현재 prop을 기준으로 membership data를 다시 만듭니다.
비활성 상태와 읽기 전용 상태
비활성 상태에서는 입력과 포커스가 비활성화됩니다. 읽기 전용 상태에서는 포커스로 현재 값을 확인하며 값은 고정됩니다. 각 실행 환경은 이 차이를 해당 환경의 기본 관례에 맞춰 표현합니다.
