개발 일지/주간 개발 일지

[06월 4주차] 프론트엔드 element plus 사용 방법

계란💕 2023. 6. 24. 14:24

 

 

 

 


element plus를 이용한 탭 만들기 - Vue.js

  • 여러 가지 탭이 있을 때 하나의 탭을 클릭 시, 그에 대한 내용만 보이도록 구현하려고 한다. 
  • 사내에서 element plus라는 디펜던시를 사용하고 있다.( package.json 파일에 있는 dependency 목록에  element plus의 버전을 정의하면 된다. )  => Java에서 build.gradle/ pom.xml  파일에 dependency를 설치하는 것과 같다. 
    • 엘리먼트 플러스(element plus): Vue.js 기반의 UI 컴포넌트 라이브러리이다. 사용하기 쉬운 UI 컴포넌트를 제한다. 버튼, 입력 필드, 선택 목록, 테이블, 모달 창 같은 UI요소를 포함하고 있다. 
    • main.js 파일에서 element plus 를 import 해야한다. 
  • 주의) tabPosition에 바로 "left"를 넣으면 적용되지 않고 <script> 안 쪽에 ref("left") 라고 선언한 변수를 사용해야 적용된다. 
    • 이런 식으로 데이터 바인딩을 설정해야한다. 설정하면 ref 변수가 Vue의 reactive 시스템에 등록된다. 이렇게 등록된 변수를 데이터 변경 감지를 위해 감시 대상이 되며 해당 변수의 값이 변경될 때마다 탭 버튼 레이아웃이 적용되는 것이다. 
  • <el-tab-pane> 은 엘리먼트 플러스에서 제공하는 탭 컴포넌트 중 하나이다. 탭 패널을 구성한다. 탭 버튼을 클릭하면 해당 패널의 내용이 표시되도록 한다. 
  • v-for을 사용해서 미리 만들어둔  tabList 의 목록을 보여준다. 

 

// main.js 파일
import ElementPlus from "element-plus";
app.use(ElementPlus);

 

<el-tabs type="card" :tab-position="tabPosition" class="demo-tabs">
<el-tab-pane
  v-for="(tab, index) in tabList"
  :key="index"
  :label="tab.name"
>
  <div class="boxLayout">
    <div class="boxCnt">
      <div class="ly-table">
        <div>
          <ComnList
            :tableHeader="tableHeader"
            :tableData="tableData"
          >
          </ComnList>
        </div>
      </div>
    </div>
  </div>
</el-tab-pane>
</el-tabs>

<script>

const tabPosition = ref("left");

const tabList = {
	{name: "User"}, 
	{name: "Config"}, 
	{name: "Role"},
    {name: "Task"}, 
};

</script>
생략
</style>

 

 

  Note) 실행 결과

 

cf)  https://element-plus.org/en-US/component/tabs.html#tab-position

 


테이블 만들기 - v-slot

  • 표 형태의 테이블을 만들려고 하는데 각 로우에 대해 한 줄씩 지울 수 있는 삭제 버튼을 만들려고 한다. 
  • 사내에서 만든 ComnList 라는 자식 컴포넌트에 리스트 형태로 보여줄 데이터를 전달하고  <template> 형태로 한 컬럼씩 만들어준다. 
  • <template v-slot>
    • v-slot: Vue.js에서 슬롯(slot)을 사용하는데 사용되는 지시자이다. 
    • 컴포넌트의 템플릿에서 다른 컴포넌트나 html 요소를 포함시킬 수 있는 특별한 영역이다. 
    • 해당 슬롯에 컴포넌트나 데이터를 전달 가능하다. 
    • ex) <template v-slot:btnDelete="slotData">: 각 행마다 삭제 버튼을 만들어준다. handle() 안에 들어가는 인덱스 위치에 있는 데이터를 지워주도록 메서드를 구현한다. 
    • slotData: 슬롯에 전달되는 데이터를 나타내는 변수이다. 
    • Vue에서 부모 => 자식컴포넌트로 데이터를 전달할 수 있다. 이 때 전달된 데이터는 자식 컴포넌트에서 "slotData" 와 같은 변수명으로 접근해서 사용 가능하다. 
  • tableHeader는 script 안에 위의 template 안에 있는 필드명과 동일한 데이터를 미리 만들어둬야한다. 
  • 그리고 slotData.$index 는 표에서 각 행의 인덱스를 나타낸다. 
  • checkData는 스크립트 영역에  key가 중복인지 아닌지 체크하는 메서드를 정의한다.
  • v-slot 뒤에는 앞에서 정의한 tableHeader의 필드명을 넣어준다. 

 

 

  Ex) param 목록 수정 화면

<hide/>
<ComnList
    :tableHeader="tableHeader"
    :tableData="tableData"
>
    <template v-slot:key="slotData">
      <el-input
        v-model="slotData.row.key"
        :aria-disabled="!editable"
      ></el-input>
      <span
        class="badge badge-danger mt-1"
        v-if="checkData(slotData.$index)"
        >이미 존재하는 파라미터 명입니다.
      </span>
    </template>
    <template v-slot:val="slotData">
      <el-input
        v-model="slotData.row.val"
        :aria-disabled="!editable"
      ></el-input>
    </template>
    <template v-slot:desc="slotData">
      <el-input
        v-model="slotData.row.desc"
        :aria-disabled="!editable"
      ></el-input>
    </template>
    <template v-slot:btnDelete="slotData">
      <el-button
        @click="($event) => handleDeleteModel(slotData.$index)"
        >삭제</el-button
      >
    </template>
</ComnList>`


<script setup>

const tableHeader = ref([
  {
    prop: "key",
    label: "파라미터 명",
    width: 250,
    columnType: "custom",
  },
  {
    prop: "val",
    label: "파라미터 값",
    width: 250,
    columnType: "custom",
  },
  {
    prop: "desc",
    label: "파라미터 설명",
    width: 250,
    columnType: "custom",
  },
  {
    prop: "btnDelete",
    label: "",
    width: 250,
    columnType: "custom",
  },
]);
</script>

 

  Note) 실행 결과

 

 


org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [42501]: ERROR: permission denied for relation table_model
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:133)
  • 오류: DB 권한 사용 문제
  • 원인: 데이터베이스에 접근할 수 있도록 권한이 설정되어 있지 않다. 
  • 해결: 데이터베이스 관리자가 권한을 설정한다.