동일한 페이지에서 여러 Vue 구성 요소의 성능 향상
동일한 뷰에 수백 또는 수천 개의 vue 구성 요소 인스턴스를 탑재하는 앱을 만들고 있다.각 구성 요소에는 vuex 저장소의 개체를 나타내는 ID가 있다.
<my-component :id="item1"></my-component>
<my-component :id="item2"></my-component>
<my-component :id="item3"></my-component>
...
스토어:
state: {
myComponentData: [
{
id: 'item1',
name: 'Hawaiian Shirt',
selected: false,
// ...
},
// ...
]
}
인my-component
, 나는 상점에서 그것의 물체를 찾아 계산된 속성에 저장한다.
computed: {
myComponentData: function () {
return this.$store.state.myComponentData.find(el => el.id === this.id);
},
isSelected: function () {
return this.myComponentData.selected;
},
// ...
}
스토어의 객체 속성은 컴포넌트 자체 또는 앱의 다른 컴포넌트와 상호 작용하여 조작할 수 있다.
문제는 수백, 1000개 이상의 원소로 이것을 실행해 보면 로딩하는 데 30초 이상이 걸린다는 것이다.
계산된 속성을 제거하거나 정적 값으로 바꾸면 페이지가 원활하게 로드된다.스토어에서 계산된 모든 속성을 로드하려고 할 때에만 지연 문제가 발생한다.
계산된 속성과 Vuex를 사용하는 많은 (1500+) Vue 구성 요소를 로드할 때 성능을 향상시킬 수 있는 방법이 있는가?나는 가능한 해결책으로 동적/아신크 구성 요소, vue-async-c-c-computed 및 vue-rx를 조사했지만, 이 경우 어떤 것이 도움이 될지는 잘 모르겠다.
그 문제는 논리에 들어 있다.1000개의 항목이 있는 경우 1000개의 구성요소를 생성하십시오.그리고 나서 그들은 ID를 기반으로 적절한 항목을 찾기 위해 항목 목록을 반복한다.그래서 당신은 기본적으로 1000 * 1000 루프를 하고 있다.최악의 상황은 아니다 - 당신은 이 계산된 속성을 통해 반응성을 더하고 있다!무언가가 바뀔 때마다 계산된 방법이 다시 발사되어 다른 1000루프(항목이 마지막일 경우 최악의 경우 시나리오)로 이어진다.
몇 가지 옵션을 선택하십시오.
구성 요소의 데이터를 설정하는 동안 스토어의 항목을 가져오십시오.이렇게 하면 계산된 속성이 생성되지 않으므로 정적 데이터가 생성될 수 있다.그러면 원하는 모든 데이터에 대해 개인 감시자를 만들게 될 것이다.
(이걸로 하겠어)상위 구성 요소에 목록을 표시하는 항목 목록이 있는 경우아이디만 패스하지 말고 전체 아이템을 패스해.이렇게 하면 계산된 속성을 사용할 필요가 없으며, 즉시 반응성을 가질 수 있다(프로포즈는 자동으로 하위 항목에서 업데이트됨).
그렇게 많은 루프 및 계산된 속성을 추가하지 마십시오. 이름에서 알 수 있듯이 다른 곳에서 필터링할 수 있는 항목을 필터링하는 것이 아니라 컴퓨팅을 위한 속성임;)
행운을 빈다!
내 생각에Array.find()
운영비가 가장 많이 든다.계산된 속성에 있다는 것은 종속성이 변경될 때마다 실행된다는 것을 의미한다.
배열 인덱스를 가져올 수 있는 위치mounted()
그리고 계산에 쓰세요,
export default {
name: "MyComponent",
props: ["id"],
data() {
return {
storeIndex: -2
};
},
mounted() {
this.storeIndex = this.$store.state.myComponentData.findIndex(
el => el.id == "item" + this.id
);
},
computed: {
myComponentData: function() {
// return this.$store.state.myComponentData.find(
// el => el.id === "item" + this.id
// );
return this.$store.state.myComponentData[this.storeIndex] || {};
},
isSelected: function() {
return this.myComponentData.selected;
}
}
};
여기 CodeSandbox가 작업 예시 입니다.
'IT이야기' 카테고리의 다른 글
v-model에 소품 바인딩 시도 중 (0) | 2022.04.25 |
---|---|
바인딩 실패:이미 사용 중인 주소 (0) | 2022.04.25 |
Vue.js 2 - vue-youtube가 포함된 비디오 종료 상태 탐지 방법? (0) | 2022.04.25 |
서버측 페이지 지정을 사용하여 Quasar q-table을 구현하는 방법 (0) | 2022.04.25 |
Vue JS에서 v-for를 사용하여 구성 요소에 대한 소품 설정 (0) | 2022.04.25 |