[javascript] Vue.js-중첩 된 데이터를 올바르게 감시하는 방법
소품 변형을 올바르게 감시하는 방법을 이해하려고합니다. ajax 호출에서 데이터를 수신하고 데이터를 객체 안에 넣고 v-for 지시문을 통해 일부 하위 구성 요소를 렌더링 단순화 아래에 렌더링하는 상위 구성 요소 (.vue 파일)가 있습니다.
<template>
<div>
<player v-for="(item, key, index) in players"
:item="item"
:index="index"
:key="key"">
</player>
</div>
</template>
… 그런 다음 내부 <script>
태그 :
data(){
return {
players: {}
},
created(){
let self = this;
this.$http.get('../serv/config/player.php').then((response) => {
let pls = response.body;
for (let p in pls) {
self.$set(self.players, p, pls[p]);
}
});
}
아이템 객체는 다음과 같습니다 :
item:{
prop: value,
someOtherProp: {
nestedProp: nestedValue,
myArray: [{type: "a", num: 1},{type: "b" num: 6} ...]
},
}
이제 내 자식 “플레이어”구성 요소 내에서 항목의 속성 변형을 보려고합니다.
...
watch:{
'item.someOtherProp'(newVal){
//to work with changes in "myArray"
},
'item.prop'(newVal){
//to work with changes in prop
}
}
그것은 작동하지만 조금 까다로워 보입니다. 그리고 이것이 올바른 방법인지 궁금합니다. 내 목표는 prop
변경 될 때마다 어떤 행동을 수행 하거나 myArray
새로운 요소 나 기존의 요소 내에서 변형을 얻는 것입니다. 모든 제안을 부탁드립니다.
답변
이를 위해 깊은 감시자 를 사용할 수 있습니다 .
watch: {
item: {
handler(val){
// do stuff
},
deep: true
}
}
이제 item
배열 의 객체에 대한 변경 사항 과 Vue.set 과 함께 사용되는 경우 배열 자체에 대한 추가 사항을 감지합니다 . JSFiddle은 다음과 같습니다. http://jsfiddle.net/je2rw3rs/
편집하다
최상위 객체의 모든 변경 사항을보고 싶지 않고 중첩 된 객체를 직접 보는 데 덜 어색한 구문을 원한다면 computed
대신 간단히 볼 수 있습니다 .
var vm = new Vue({
el: '#app',
computed: {
foo() {
return this.item.foo;
}
},
watch: {
foo() {
console.log('Foo Changed!');
}
},
data: {
item: {
foo: 'foo'
}
}
})
JSFiddle은 다음과 같습니다. http://jsfiddle.net/oa07r5fw/
답변
또 다른 좋은 접근 방법과 조금 더 우아한 방법은 다음과 같습니다.
watch:{
'item.someOtherProp': function (newVal, oldVal){
//to work with changes in someOtherProp
},
'item.prop': function(newVal, oldVal){
//to work with changes in prop
}
}
(나는 여기 의견에 @peerbolte 에서이 접근법을 배웠습니다 )
답변
자식 객체의 VueJs 딥 워치
new Vue({
el: "#myElement",
data: {
entity: {
properties: []
}
},
watch: {
'entity.properties': {
handler: function (after, before) {
// Changes detected. Do work...
},
deep: true
}
}
});
답변
속성을 잠시보고 나서 보지 않으려면 어떻게해야합니까?
또는 라이브러리 하위 구성 요소 속성을 보려고합니까?
“동적 감시자”를 사용할 수 있습니다.
this.$watch(
'object.property', //what you want to watch
(newVal, oldVal) => {
//execute your code here
}
)
가 $watch
호출 될 경우 시청을 중지 것이다 주시 해제 기능을 반환합니다.
var unwatch = vm.$watch('a', cb)
// later, teardown the watcher
unwatch()
또한 deep
옵션을 사용할 수 있습니다 :
this.$watch(
'someObject', () => {
//execute your code here
},
{ deep: true }
)
좀 걸릴 있는지 확인하십시오 문서로를
답변
여기에 언급되지 않았지만 수업을 vue-property-decorator
연장하는 경우 패턴 을 사용할 수도 있습니다 Vue
.
import { Watch, Vue } from 'vue-property-decorator';
export default class SomeClass extends Vue {
...
@Watch('item.someOtherProp')
someOtherPropChange(newVal, oldVal) {
// do something
}
...
}
답변
이 솔루션을 ‘해킹’하는 데 추가 한 또 다른 방법은 이렇게 computed
하는 것입니다. 중첩 된 개체 값을 반환 하는 별도의 값을 설정했습니다 .
data : function(){
return {
my_object : {
my_deep_object : {
my_value : "hello world";
}.
},
};
},
computed : {
helper_name : function(){
return this.my_object.my_deep_object.my_value;
},
},
watch : {
helper_name : function(newVal, oldVal){
// do this...
}
}
답변
사용의 허용 대답에 내 문제는 deep: true
, 배열을 깊은 볼 때, 나는 쉽게 식별 할 수 있다는 것입니다 있는 변화를 포함하는 배열의 요소입니다. 내가 찾은 유일한 해결책은 이 답변 입니다. 이 답변은 구성 요소를 만드는 방법을 설명하므로 각 배열 요소를 개별적으로 볼 수 있습니다.