선택 변경 시 Vue 구성 요소가 업데이트되지 않는 이유
선택 상자를 변경할 때 vue 구성 요소 내의 일부 텍스트를 변경하는 폼이 있습니다.현재 발생하고 있는 문제를 나타내기 위해 jsfiddle에서 이 기능을 매우 최소화한 버전을 만들었습니다.
https://jsfiddle.net/ywaug7ft/
HTML:
<div id="app">
<h5>Select a gender</h5>
<select v-model="gender">
<option disabled="disabled" value>Select...</option>
<option value="1">Male</option>
<option value="2">Female</option>
<option value="3">Couple</option>
</select>
<div></div>
<detail-component v-for="(detail, index) in details" :data="detail" :index="index"></detail-component>
{{details}}
</div>
<template id="details">
<div>
<h4><span v-if="item.gender == 3 && index == 0">Her</span><span
v-else-if="item.gender == 3 && index == 1">His</span><span v-else>Your</span> Health Details</h4>
<div>Index: {{index}}</div>
<div>Gender: {{item.gender}}</div>
</div>
</template>
Vue:
Vue.component('detail-component', {
template: '#details',
props: ['data', 'index'],
data() {
return {
item: {
gender: this.data.gender
}
}
}
});
var app = new Vue({
el: '#app',
data: {
gender: '',
details: [],
options: {
gender: {
"1": "Single Female",
"2": "Single Male",
"3": "Couple"
}
}
},
watch: {
gender: function(val) {
this.details = [];
if (val == 1) {
this.details.push({gender: 1});
} else if (val == 2) {
this.details.push({gender: 2});
} else if (val == 3) {
this.details.push({gender: 3}, {gender: 3});
}
}
}
});
기본적으로는 제가female또는male드롭다운에서 내 vue 컴포넌트는 h 태그를 업데이트하여Your Details선택했을 때couple뷰 컴포넌트는 다음과 같이 갱신됩니다.Her Details그리고.His Details그러나 첫 번째 인덱스는 업데이트되지 않습니다.Her대신 유지하다Your.
jsfiddle을 보면 정확히 무슨 뜻인지 알 수 있을 거예요.
그냥 내가 뭘 잘못하고 있는지 이해하려고 하는 거야저는 워처를 사용하면 컴포넌트에서 반응하는 줄 알았어요.
소품 값이 업데이트되는지 여부를 자녀 내부에서 감시하고 있지 않습니다.
그래서 여기 소품들이data필요한 변경watch자 컴포넌트에서도 마찬가지입니다.
바이올린을 보다
watch:{
data(val){
this.item.gender=val.gender
}
}
또는 계산된 속성 Fielen.
computed:{
item(){
return this.data;
}
}
잘못된 참조를 사용하고 있습니다.detail-component수신하다data하지만 당신의 레퍼런스는item템플릿에 추가해 주세요.
템플릿을 다음과 같이 변경하는 경우:
<template id="details">
<div>
<h4>
<span v-if="data.gender === 3 && index === 0">Her</span>
<span v-else-if="data.gender === 3 && index === 1">His</span>
<span v-else>Your</span>
Health Details
</h4>
<div>Index: {{index}}</div>
<div>Gender: {{data.gender}}</div>
</div>
</template>
동작합니다(이 바이올린 참조).
여기서의 문제는 첫 번째 세부 객체에 성별 1이 있어서 "Her"가 아닌 "Your"가 나왔다는 것입니다.
이 문제는 코드의 다음 부분으로 인해 발생합니다.
data() {
return {
item: {
gender: this.data.gender
}
}
}
값을 할당한 경우gender당신의 소품에서 내부 재산으로data()오브젝트는 즉시 참조를 잃습니다.그래서 언제?data소품이 업데이트되었지만 업데이트되지 않았습니다.item.gender.
만약 당신의 목적이 단지alias성별은 사용하기 쉽도록 더 짧은 이름을 가진 변수로, 당신은 또한 매번 업데이트 될 속성을 사용할 수 있습니다.data변경되어 있습니다.
computed: {
item() {
return this.data
}
}
저 같은 경우에는...:v-model템플릿에 추가되어 있습니다.그렇지만v-model대장을 가져가지 않습니다.그게 모든 걸 망가뜨렸어.
언급URL : https://stackoverflow.com/questions/51992261/why-vue-component-wont-update-on-select-change
'source' 카테고리의 다른 글
| Vue.js: API에서 데이터를 가져와 하위 컴포넌트에 전달(간단한 예) (0) | 2022.07.23 |
|---|---|
| C에서 새로운 변수를 선언할 수 있는 경우와 선언할 수 없는 경우 (0) | 2022.07.23 |
| 클래스 JavaLaunchHelper는 양쪽에서 구현됩니다.libinstrument.dylib.둘 중 하나가 사용됩니다.정의되지 않은 것 (0) | 2022.07.23 |
| 파일명이 아닌 부모 디렉토리 이름만 언급하여 index.vue를 Import하는 방법 (0) | 2022.07.23 |
| C의 암묵적 함수 선언 (0) | 2022.07.23 |