nv-grid
ag-grid-vue3를 기반으로 만든 Vue 3 컴포넌트로, 고급 그리드 기능과 사용자 컬럼 설정 기능을 통합하여 재사용 가능하게 만든 커스텀 그리드입니다.
props
이름 | 타입 | 기본값 | 설명 |
---|---|---|---|
grid-class | String | ag-grid에 적용할 CSS 클래스 | |
grid-style | String | 'width: 100%; height:98%;' | ag-grid의 style 속성 |
service | Object | 외부 API 요청용 서비스 객체 | |
query | Object | 데이터 요청 쿼리 객체 | |
pagination | Object | 페이징 처리 및 정렬용 객체 | |
resizable | Boolean | false | 컬럼 사이즈 조정 여부 |
key-prop | String | 'id' | 고유 식별자로 사용할 row key 필드명 |
row-height | String | Number | 35 | ag-grid row 높이 |
keep-column-state | Boolean | false | 컬럼 상태(정렬, 너비 등)를 유지할지 여부 |
enable-cell-text-selection | Boolean | true | 셀 텍스트 드래그 선택 가능 여부 |
row-data | any | null | 그리드에 표시할 데이터 |
grid-options | Object | ag-grid의 native 옵션 객체 | |
grid-id | String | 'grid-' + generateId('grid') | grid 식별자 (event bus 및 설정 관리용) |
...ag-grid-props | 다양 | ag-grid-utils에서 정의한 기본 props 포함 | ag-grid에 필요한 나머지 속성 자동 포함 (columnDefs , defaultColDef 등) |
Emits
이름 | 설명 |
---|---|
nv-grid-ready | 그리드 초기화 완료 시 호출. 인자로 params 객체 전달 |
nv-sorted | 컬럼 정렬 변경 시 호출. 현재 columnState 전달 |
nv-selection-changed | row 선택 상태 변경 시 호출 (사용자가 row 선택 시 등) |
nv-row-drag-end | row drag & drop 종료 시 호출. 전체 row data 배열 전달 |
nv-row-clicked | row 클릭 시 호출. 해당 row의 data 객체 전달 |
기본
html
<nv-grid ref="Grid"
:rowData="list"
:gridOptions="grid.option"
:keepColumnState="true"
:pagination="pagination">
<nv-grid-col headerName="번호" field="positionIdx" :width="50" :cellStyle="grid.style.end"></nv-grid-col>
<nv-grid-col headerName="제목" field="title" :width="150" :flex="1"></nv-grid-col>
</nv-grid>
Row Click
@nv-row-clicked
을 이용하여 row 클릭시 데이터를 가져올 수 있습니다.
vue
<nv-grid ref="UserGrid"
:row-data="list"
:grid-options="grid.option"
keep-column-state
@nv-row-clicked="rowClicked"
>...</nv-grid>
<script setup lang="ts">
const rowClicked = (data) => {
alert(JSON.stringify(data));
}
</script>
row click으로 detail 모달 열기
vue
<nv-grid ref="BoardGrid"
:row-data="list"
:grid-options="grid.option"
keep-column-state
:pagination="pagination"
@nv-row-clicked="openDetail"
>...</nv-grid>
<script setup lang="ts">
const openDetail = (data) => {
const {open,} = useModal({
component: CommonDetailModal,
attrs: {
label: '보드',
id: data.id,
componentName: 'board-detail',
comp: detailComponent
}
});
open();
}
</script>
Checkbox Select
gridRef.value.api.getSelectedRows()
를 사용하여 선택한 row의 데이터를 가져올 수 있습니다.
vue
<nv-grid ref="gridRef"
:row-data="list"
:grid-options="grid.option"
keep-column-state
@nv-row-clicked="rowClicked"
>
<nv-grid-col :width="50"
:header-checkbox-selection="true"
:header-checkbox-selection-filtered-only="true"
:checkbox-selection="true"/>
...
</nv-grid>
<script setup lang="ts">
const gridRef = useTemplateRef('gridRef');
const selectRowData = () => {
const selected = gridRef.value.api.getSelectedRows();
alert(JSON.stringify(selected));
}
</script>
여러개의 grid를 한 페이지에서 사용할 때
grid-options
는 서로 다른 객체를 사용해야 합니다.
vue
<nv-grid ref="multiGird1"
:row-data="list"
:grid-options="gridOptions3"
keep-column-state
>
...
</nv-grid>
<nv-grid ref="multiGird2"
:row-data="list2"
:grid-options="gridOptions4"
keep-column-state
>
...
</nv-grid>
<script setup lang="ts">
const gridOptions3 = JSON.parse(JSON.stringify(grid.option));
const gridOptions4 = JSON.parse(JSON.stringify(grid.option));
</script>
WARNING
하나의 gridOptions
객체를 여러 그리드에 공유할 경우, 다음과 같은 문제가 발생할 수 있습니다.
columnApi
,api
,columnState
등이 겹쳐서 충돌- 그리드 상태(정렬, 필터, 컬럼 너비 등)가 서로 영향을 줌
- 일부 이벤트가 한 그리드에서 발생해도 다른 그리드로 전파