【发布时间】:2017-06-11 06:04:57
【问题描述】:
我有一个用户个人资料部分,我试图让用户编辑他们的信息。我正在使用 vuex 存储用户配置文件数据并将其拉入表单。编辑表单位于 userProfile 组件的子组件中 - 它加载数据保存并将其提交到 VUEX。
所以我可以使用来自 VUEX 的数据填充表单,但是一旦我更改了表单中的任何值,它也会更改我的父组件中的值。
在保存表单之前,我不会对 VUEX 进行更改,因此这意味着数据以两种方式绑定到 VUEX。我的印象是这是不可能的。在这种情况下,这是不希望的,因为如果用户更改了一些数据,然后在没有实际单击“保存”的情况下导航离开,则 VUEX 的数据仍然被更改。
注意,这是一个简化的例子。我实际上使用路由器视图来加载子组件,或者我会通过道具传递数据。我已经测试了直接加载编辑配置文件组件,如下所示,我遇到了同样的问题。
请看下面的代码,我找不到数据被发送回商店的原因。任何帮助是极大的赞赏。
在父级中,我设置检索用户数据,如下所示:
<template>
<div class="content">
<h1>{{getUserDetails.firstname}} {{getUserDetails.lastname}} </h1>
<edit-profile></edit-profile>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import EditProfile from './Edit.vue';
export default {
data() {
return {
// data
}
},
created () {
this.fetchData();
},
components: {
EditProfile:EditProfile
},
computed: mapGetters([
'getUserDetails'
]),
methods: {
fetchData: function () {
var _this = this;
// ajax call - then
_this.$store.commit('setData', {
name: 'userDetails',
data: response.data.data.userDetails
});
}
}
}
</script>
这会加载结果并将它们存储在商店中,效果很好。
我的商店有这个:
const store = new Vuex.Store({
state: {
userDetails: {}
},
mutations: {
setData(state, payload){
state[payload.name] = payload.data;
}
},
getters: {
getUserDetails: state => {
return state.userDetails;
}
}
}
这里一切正常。
在我的带有编辑表单的子组件中,我正在像这样填充表单:
<template>
<form>
<label>Name</label>
<input name="firstname" v-model="profile.firstname">
<input name="lastname" v-model="profile.lastname">
<button v-on:click="save">submit</button>
</form>
</template>
<script>
import {mapGetters } from 'vuex';
export default {
data() {
return {
profile:{}
}
},
watch: {
getUserDetails (newData){
this.profile = newData;
}
},
created (){
this.profile = this.$store.getters.getUserDetails;
},
computed: mapGetters([
'getUserDetails'
]),
methods:{
save (){
var _this = this;
// ajax call to POST this.profile then
_this.$store.commit('setData', {
name: 'userDetails',
data: this.profile
});
}
}
}
</script>
【问题讨论】:
标签: data-binding vue.js vuejs2 vue-router vuex