UniApp 개발 시 자주 발생하는 이슈 및 해결 방안

uni-icons 컴포넌트의 데이터 바인딩 동작 차이

uni-icons를 사용할 때 속성에 데이터를 직접 바인딩하면 웹 브라우저에서는 정상 작동하지만, WeChat Mini Program 시뮬레이터나 실제 기기에서는 렌더링 문제가 발생할 수 있습니다. 이를 방지하기 위해서는 아이콘 태그 외부에서 데이터를 처리하거나 속성값을 안전하게 분리하는 것이 좋습니다.

<view class="icon-wrapper">
  <uni-icons type="person" size="24"></uni-icons>
  <text>{{ displayText }}</text>
</view>

콜백 함수 내에서의 this 컨텍스트 바인딩 문제

Vue 2 환경의 비동기 API(예: uni.getStorage) 콜백 함수에서 일반 함수를 사용하면 this가 Vue 인스턴스를 가리키지 않는 문제가 발생합니다. ES6의 화살표 함수(Arrow Function)를 사용하여 상위 스코프의 this를 유지해야 합니다.

uni.getStorage({
  key: 'app_token',
  success: (res) => {
    // 화살표 함수를 사용하여 this가 Vue 인스턴스를 가리키도록 함
    this.localToken = res.data;
    console.log('Retrieved token:', res.data);
  },
  fail: (err) => {
    console.error('Storage access failed', err);
  }
});

Flexbox 레이아웃의 정렬 속성 호환성

CSS Flexbox를 사용하여 요소를 우측 정렬할 때 justify-content: right 속성은 웹 브라우저에서는 작동할 수 있으나, WeChat Mini Program 환경에서는 무시될 수 있습니다. 대신 flex-end 값을 사용하여 크로스 플랫폼 환경에서 모두 정상적으로 정렬되도록 구현해야 합니다.

.action-container {
  display: flex;
  justify-content: flex-end; /* 'right' 대신 'flex-end' 사용 권장 */
}
<view class="action-container">
  <button type="default" size="mini">삭제</button>
</view>

Button 컴포넌트의 너비 제어 이슈

uni-app의 button 컴포넌트는 기본적으로 내부에 padding과 margin이 포함되어 있어, CSS로 직접 width를 조절하려 할 때 의도대로 동작하지 않는 경우가 많습니다. 버튼 컴포넌트 자체에 스타일을 적용하는 대신, 부모 view 요소로 감싸고 부모의 레이아웃 속성을 통해 간접적으로 크기를 제어하는 것이 효과적입니다.

<!-- 부모 뷰를 통해 버튼의 영역 제어 -->
<view class="btn-wrapper">
  <button type="primary">확인</button>
</view>

v-for와 v-if의 동시 사용에 따른 렌더링 오류

uni-card와 같은 컴포넌트에 v-for와 v-if를 동시에 적용하면, 특정 조건부 필터링 로직이 정상적으로 작동하지 않거나 렌더링 순서 꼬임 현상이 발생할 수 있습니다. 이를 해결하기 위해 v-if 조건을 내부에 두거나, 상위 view 태그에서 v-for를 수행하고 내부에서 v-if로 필터링하는 구조로 변경해야 합니다.

<!-- 상위 view에서 루프를 돌고 내부에서 조건을 처리 -->
<view v-for="(item, index) in itemList" :key="item.id">
  <uni-card v-if="!item.isArchived" :title="item.subject">
    <text>{{ item.description }}</text>
  </uni-card>
</view>
export default {
  data() {
    return {
      itemList: [
        { id: 101, subject: 'Project A', description: '...', isArchived: false },
        { id: 102, subject: 'Project B', description: '...', isArchived: true }
      ]
    };
  }
};

라이프사이클 훅 작성 시 화살표 함수 사용 지양

Vue 2의 라이프사이클 훅(예: mounted, created)을 화살표 함수로 정의하면, this가 상위 컨텍스트를 가리키게 되어 Vue 인스턴스의 데이터나 메서드에 접근할 수 없게 됩니다. 반드시 일반 함수 선언식을 사용하여 this가 컴포넌트 인스턴스에 바인딩되도록 해야 합니다.

export default {
  data() {
    return {
      message: 'Hello'
    };
  },
  // 정상: 일반 함수 선언 사용
  mounted() {
    console.log(this.message); // 'Hello' 출력
  }
};

태그: UniApp Vue.js CSS JavaScript wechat-miniprogram

9월 27일 23:30에 게시됨