Vue.js2 - Object.assign({}, this.var)을 차단하는 감시 메서드
this.user(글로벌 계산 속성)를 반환합니다.물론 실제 사용자 데이터를 덮어쓰고 싶지 않기 때문에 복사본을 만듭니다.Object.assign을 사용하고 있습니다.단, return Object.assign({}, this.user)(this.user와 반대)을 포함하면 watch 메서드는 더 이상 작동하지 않습니다.
템플릿은 다음과 같습니다(bootstrap-vue를 사용하고 있습니다).
<template>
<form role="form">
<b-form-group
label="First Name"
label-for="basicName"
:label-cols="3"
:horizontal="true">
<b-form-input id="user-name-first" type="text" v-model="userFormData.fname"></b-form-input>
</b-form-group>
<b-form-group
label="Last Name"
label-for="basicName"
:label-cols="3"
:horizontal="true">
<b-form-input id="user-name-lirst" type="text" v-model="userFormData.lname"></b-form-input>
</b-form-group>
<b-form-group
label="Email"
label-for="user-email"
:label-cols="3"
:horizontal="true">
<b-form-input id="user-email" type="text" v-model="userFormData.email"></b-form-input>
</b-form-group>
<b-form-group
:label-cols="3"
:horizontal="true">
<b-button type="submit" variant="primary">Save changes</b-button>
<b-button type="button" variant="secondary" @click="userFormCancel">Cancel</b-button>
</b-form-group>
</form>
</template>
따라서 이 기능이 작동하며 editspending이 userProfile에 변경 사항이 적용될 때마다 true로 설정됩니다(입력 시 v-model을 통해).
<script>
export default {
name: 'userProfile',
data () {
return {
editsPending: false
}
},
computed: {
userFormData: function () {
return this.user
}
},
watch: {
userFormData: {
deep: true,
handler (val) {
this.editsPending = true
}
}
},
methods: {
userFormCancel () {
this.editsPending = false
}
}
}
</script>
...하지만, 이것은 그렇지 않습니다.userFormData는 사용자의 클론이 되지만 editsPending은 userFormData 업데이트에 영향을 받지 않습니다.
<script>
export default {
name: 'userProfile',
data () {
return {
editsPending: false
}
},
computed: {
userFormData: function () {
return Object.assign({}, this.user)
}
},
watch: {
userFormData: {
deep: true,
handler (val) {
this.editsPending = true
}
}
},
methods: {
userFormCancel () {
this.editsPending = false
}
}
}
</script>
누가 왜 이런 일이 일어나는지 설명하고 실행 가능한 해결책을 제안할 수 있습니까?
계산된 속성은 종속성 중 일부가 변경된 경우에만 재평가됩니다.(소스)
그래서 이 기능이return this.user
와 함께가 아니라Object.assign
반응 의존성이 아니기 때문입니다.
반응성 데이터를 원하는 경우 초기화해야 합니다.userFormData
Vue 인스턴스가 생성될 때 빈 개체 데이터로 사용자를 할당합니다.
data () {
return {
editsPending: false,
userFormData: {}
}
},
created() {
this.userFormData = Object.assign({}, this.user)
},
다른 것을 테스트하고, 표시되는 동작을 재현.
당신의 템플릿에서 당신의 입력은 다음과 같이 구속되어 있는 것 같습니다.UserFormdata
(표준)
<input v-model="userFormData.name">
(정답) 대신
<input v-model="user.name">
템플릿을 공유해 주시면 도움이 됩니다;)
편집: 템플릿 추가 후.
new Vue({
el: '#app',
data () {
return {
editsPending: false,
user: { name: 'John Doe' },
userCachedData: {},
}
},
created() {
this.userCachedData = Object.assign({}, this.user);
},
watch: {
user: {
deep: true,
handler (val) {
this.editsPending = true
}
}
},
methods: {
userFormCancel () {
this.editsPending = false
}
}
})
<div id="app">
{{ user }}
{{ userCachedData }}
<br>
<input v-model="user.name" />
{{ this.editsPending }}
</div>
코드명: https://codepen.io/aurelien-bottazini/pen/BVNJaG?editors=1010
$emit을 사용하여 개체에 값을 할당할 수 있습니다.
mounted() {
this.$emit("userFormData", this.user);
}
언급URL : https://stackoverflow.com/questions/50631769/vue-js2-object-assign-this-var-preventing-watch-method
'sourcecode' 카테고리의 다른 글
어레이가 변경되어 v-key가 지정된 경우에도 VueJ가 목록을 다시 렌더링하지 않음 (0) | 2022.08.17 |
---|---|
vuex 스토어의 악리를 통해 게시한 후 리다이렉트하는 올바른 방법 (0) | 2022.08.17 |
다차원 어레이의 올바른 할당 (0) | 2022.08.17 |
C 실행 파일 이름 결정 (0) | 2022.08.17 |
구성 요소에서 내 스토어 개체에 액세스할 수 없음 (0) | 2022.08.17 |