runtime-core.esm-bundler.js:40 [Vue warn]: Invalid prop: type check failed for prop "parentComponent". Expected Object, got String with value "LearningEdit".
오류: data type 오류
원인: Object 형태로 선언한 데이터인데 String 형태의 데이터를 할당해서 발생한 문제이다.
Java에서는 모든 클래스의 조상이 Object 라서 JavaScript에서도 같을 거라고 생각했다.
하지만, JavaScript에서의 Object 는 key- value 형태의 데이터가 들어 있으며 이는 Java의 Map 과 형태가 비슷하다.
JavaScript에서의Object는 Java에서의Object는 다르기 때문에 이 부분을 알고 있어야한다.
해결
선언한 부분을 찾아서 Object 가 아닌 String 으로 바꿔준다.
runtime-core.esm-bundler.js:40 [Vue warn]: Extraneous non-props attributes (serviceList) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.
오류
컴포넌트가 프래그먼트(fragment) 또는 텍스트 루트 노드를 렌더링하고 있어서 props가 아닌 속성이 자동으로 상속되지 못해서 발생하는 문제이다.
Vue. 에서는 프래그먼크 또는 텍스트 루트 노드에서는 비 - props 속성을 자동으로 상속할 수 없다.
원인
해결
cf) 프래그먼트(fragment): Vue 컴포넌트에서 여러 개의 요소를 감싸기 위해 사용되는 가상의 래퍼 역할을 한다. 일반적으로프래그먼트는 <template>태그로 표현한다. 컴포넌트 내에서 여러 요소를 그룹화할 때 사용된다.프래그먼트는 브라우저에는 실제로 렌더링 되지 않기 때문에 추가적인 DOM 요소가 생성되지 않고 불필요한 래퍼 요소 없이 효율적으로 그룹화할 수 있다.
Vue 컴포넌트는 일반적으로 하나의 루트 요소만을 반환해야한다.
error.ts:14 ElementPlusError: [ElPagination] Deprecated usages detected, please refer to the el-pagination documentation for more details
at debugWarn (error.ts:13:37)
오류: element plus
원인: element plus 안에서 deprecated 된 어떤 기능(?)을 이용해서 에러가 났다.
해결
Note
반응형 (reactive) 객체 사용 방법 (ref, reactive) - Vue.js 3
사내에서 쓰고 있는 Vue.js와 관련하여 반응형 객체 사용하는 방법들과 차이에 대해 알아보려고 한다.
반응형: 데이터가 변하는 것을 감지하고 해당 값에 대한 작업을 실행한다. 쉽게 말해서 데이터를 변경하면 화면에 변경된 데이터를 보여주는 것이다.
ref()
String, Number, Object등 어떠한 타입에서도 사용 가능하다. 타입 제한이 없다. 특히나, reactive를 적용할 수 없는 원시형 데이터는 ref를 이용한다.
JavaScript 영역에서는 ".value"를 붙여야 데이터에 접근 가능하고 template 영역에서는 붙이지 않아도 접근 가능하다.
템플릿에서 단일 변수로 사용 가능
단일 값에 대한 반응성을 유지하면서 재할당이 가능하다.
reactice()
Object, Array, Map, Set 같은 타입에서만 사용 가능하다. 원시형(primitive type)인 String, number, boolean에 대해서는 사용할 수 없다.
어떤 배열에서 반복문을 돌면서 특정 조건을 만족하는 원소를 하나씩 지우는 로직을 짜려고 한다.
JavaScript 에서는 배열에서 원소를 하나씩 삭제할 때 .splice(index, 1)를 이용한다.
그런데 splice() 를 사용하기 위해서는 원소의 index를 반드시 알아야 한다.
처음에는 for문에서 인덱스를 0부터 시작했더니 오류가 났다. (원소를 삭제한 경우/삭제하지 않은 경우에 따라 다음 인덱스 번호가 다르기 때문에 이에 따른 처리가 필요하다. )
그래서 for문의 첫 인덱스를 length - 1 부터 내려오는 방식으로 바꿨다.
그러면 idx 번째의 원소를 삭제하거나 삭제하지 않거나 다음으로 살펴볼 인덱스 번호( idx - 1)는 동일하다.
<hide/>
let idx = tableData.value.length - 1;
for (let i = idx; i >= 0; --i) {
let param = tableData.value[i];
if (param.id === previousId) {
tableData.value.splice(i, 1);
}