구성요소 렌더 함수에 무한 업데이트 루프가 있을 수 있음
VueJS는 처음이야 Vue로부터 경고를 받았어
[Vue warn]: You may have an infinite update loop in a component render function.
V-bind:style에서 변수에 대해 V-for를 사용하는 경우 템플릿에 예:
<div v-for="item in model.items" v-bind:class="test(item.result)">
{{item.id}}
</div>
스크립트로:
data() {
return {
accept: false,
not_accept: false,
};
},
methods: {
test(result) {
if (result == 'accept') {
this.accept = true;
this.not_accept = false;
} else if (result == 'Not accept') {
this.accept = false;
this.not_accept = true;
} else {
console.log(result);
}
return {
success: this.accept,
danger: this.not_accept,
};
},
},
@Decade가 그 문제에 대해 옳다.정확한 문제는 다음과 같다.
- 일부 상태 값을 사용하여 항목 목록을 렌더링하는 렌더링 방법
참고: 상태가 변경될 때마다 렌더링 방법이 트리거됨
- 그러면 함수 결과에 따라 클래스를 바인딩하려고 하는 것이다.
test
이 기능은 상태를 다시 변이하려고 시도하여 렌더 - 테스트 - 렌더 사이클을 유발하므로 결함이 있다.
당신은 당신의 시험기능이 대신 다음과 같이 국가를 변이시키지 않도록 함으로써 이 문제를 해결할 수 있다.
methods: {
test(result) {
let accept;
if (result == 'accept') {
accept = true;
} else if (result == 'Not accept') {
accept = false;
} else {
console.log(result);
}
return {
success: accept,
danger: !accept,
};
},
}
그게 도움이 되었기를 바래!
첫째, 나는 왜 당신이 그것을 가지고 있는지 잘 모르겠다.not_accept
, 그냥 사용할 수 없을까?!this.accept
그 자리에?
네가 왜 이런 경고를 받는지 100% 확신할 수는 없지만, 내 생각은 이렇다.
의 시중을 드는 .v-bind:class
에 대한 변화를 주시하고 있다.item.result
this.accept
그리고this.not_accept
그 값들의 어떠한 변화도 전화에 의해 그것을 다시 렌더링하게 할 것이다.test
그 에서. 하지만 안에서는test
, 당신이 수정하고 있다.this.accept
그리고this.not_accept
, 그래서 Vue는 그것 때문에 결과가 바뀌었는지 다시 한번 확인할 필요가 있고, 그렇게 함으로써 바뀔 수도 있다.this.accept
그리고this.not_accept
다시, 기타 등등.
그class
구속력이 있고 자료에는 결함이 있다. class
각 항목에 대해 동일한 것으로 설정되지만, 다음에 따라 각 항목에 대한 사용자 정의 스타일을 원하는 것처럼 보인다.item.result
. 당신은 정말로 의 어떤 특성도 수정해서는 안 된다.this
안쪽에test
.
당신의 부품이 어떻게 작동하고 어떻게 해야 하는지 완전히 확신할 수 없기 때문에 철저한 대답을 하기가 어렵다.
vue 명령어로 함수를 전달하는 대신 함수를 호출하면 이 오류가 발생할 수 있다.예를 들면 다음과 같다.
나는 부스트랩 탭이 표시되면 AJAX를 통해 데이터를 로드하도록 사용자 지정 명령을 만들었어.
이것은 나쁘다:
v-on-show-bs-tab="getFirstPageSites()"
여기서 vue는 함수를 호출(또는 표현식을 평가)하고 그 결과를 지시문에 전달하는 것으로 나타난다.
이것은 좋다:
v-on-show-bs-tab="getFirstPageSites"
여기서 나는 명령어를 부를 수 있도록 함수를 이름별로 전달하고 있다.
나는 우연히 훈련받지 않은 눈으로 발견하기 쉽지 않은 비슷한 일을 하고 있었다..sort()
필터의 배열로 sort
배열을 변경하여 구성요소를 재조정한다.해결책은 우선이다.slice
배열하고 얕은 사본을 만든 다음 정렬하십시오.
불량:
filters: {
sortedDays(days) {
return days.sort().join(', ');
},
},
좋음:
filters: {
sortedDays(days) {
return days.slice().sort().join(', ');
},
},
바보 같은 실수를 저지르고도 똑같은 실수를 저질렀다.:click
의 구성 요소에서@click
필자의 경우, 나는 어떤 기능 안에 있는 물체를 돌연변이를 하고 있었는데, 그것을 돌연변이를 할 때마다 같은 기능(일종의 재귀)을 반복해서 불렀다고 생각한다.그래서 기능 본체에 이것을 가지고 있는 대신에:
this.someProperty = myObject;
모든 코드를 새로운 함수에 넣었다(함수의 이름은totalesSimples
) "myObject"를 반환하는 것.
HTML 부분에서는 다음과 같이 표시하지 않고
{{someProperty}}
나는 그것을 다음과 같이 보여주었다.
{{totalesSimples()}}
이런 식으로, 나는 함수 내부의 속성을 돌연변이로 만들어 보여 주는 것이 아니라, 함수의 결과를 보여주고 있었다.
내가 잘못한 것:
데이터 사용 시 화살표 기능을 사용하지 않음
예를 들면 다음과 같다.
data() {
state: {
foo: 'bar'
}
},
created() {
bus.$on('data_change', function(data) {
this.state = Object.assign({}, this.state, data); <-- this will cause an infinite loop
});
}
대신 화살표 기능 사용:
created() {
bus.$on('data_change',(data) => {
this.state = Object.assign({}, this.state, data);
});
}
흔히 있는 실수인 줄 알았는데
'IT이야기' 카테고리의 다른 글
index.html이 Javascript를 로드하지 않을 경우 Vue 앱을 실행하는 방법은? (0) | 2022.05.26 |
---|---|
Intel C++ 컴파일러에서 NaN - NaN == 0.0인 이유 (0) | 2022.05.26 |
리사이클러 보기 어댑터에서 컨텍스트를 가져오는 방법 (0) | 2022.05.26 |
Vuelidate 날짜 입력 필드 (0) | 2022.05.26 |
Java: Unix 타임스탬프의 날짜 (0) | 2022.05.26 |