VueJS:同时使用 v-model 和 :value
VueJS: Use v-model and :value in the same time
我正在寻找一种在同一个对象上同时使用 v-model
和 :value
的方法。
我收到这个错误:
:value="user.firstName"
conflicts with v-model
on the same element
because the latter already expands to a value binding internally.
目的是将从 mapGetters
(来自一家商店)获得的值设置为默认值,并在用户提交修改时设置正确的值。 (在 onSubmit
)
<div class="form-group m-form__group row">
<label for="example-text-input" class="col-2 col-form-label">
{{ $t("firstname") }}
</label>
<div class="col-7">
<input class="form-control m-input" type="text" v-model="firstname" :value="user.firstName">
</div>
</div>
<script>
import { mapGetters, mapActions } from 'vuex';
export default {
data () {
return {
lang: "",
firstname: ""
}
},
computed: mapGetters([
'user'
]),
methods: {
...mapActions([
'updateUserProfile'
]),
onChangeLanguage () {
this.$i18n.locale = lang;
},
// Function called when user click on the "Save changes" btn
onSubmit () {
console.log('Component(Profile)::onSaveChanges() - called');
const userData = {
firstName: this.firstname
}
console.log('Component(Profile)::onSaveChanges() - called', userData);
//this.updateUserProfile(userData);
},
// Function called when user click on the "Cancel" btn
onCancel () {
console.log('Component(Profile)::onCancel() - called');
this.$router.go(-1);
}
}
}
</script>
您应该只使用 v-model,它会创建一个与脚本中值的双向绑定:更改 js 中的变量将更新输入元素,与输入元素交互将更新变量。
如果您想使用默认值,只需将变量设置为该值(无论它来自何处)。
Vue v-model
指令是 v-bind:value
和 v-on:input
的语法糖。 This alligator.io article 帮助我理解它是如何工作的。
所以基本上你的问题是 v-model
指令将 value
设置为 firstname
,同时你还明确地将 value
设置为 user.firstName
。
有很多方法可以解决这个问题。我认为一个快速而直接的解决方案是将 firstname
存储为数据变量(正如您已经在做的那样),然后只使用 v-model
,忽略 v-bind:value
.
然后,要将商店中的用户设置为默认用户名,您可以在 created
挂钩中将 fristname
设置为商店用户的用户名:
脚本:
<script>
import { mapGetters, mapActions } from 'vuex';
export default {
created() {
this.firstname = this.user.username; // is this right? no used to the map getters syntax, but this is the idea
},
data () {
return {
lang: "",
firstname: ""
}
},
computed: mapGetters([
'user'
]),
methods: {
...mapActions([
'updateUserProfile'
]),
onChangeLanguage () {
this.$i18n.locale = lang;
},
// Function called when user click on the "Save changes" btn
onSubmit () {
console.log('Component(Profile)::onSaveChanges() - called');
const userData = {
firstName: this.firstname
}
console.log('Component(Profile)::onSaveChanges() - called', userData);
//this.updateUserProfile(userData);
},
// Function called when user click on the "Cancel" btn
onCancel () {
console.log('Component(Profile)::onCancel() - called');
this.$router.go(-1);
}
}
}
</script>
通常您希望在对象本身上设置 v-model
的 "initial" 值,例如:
data() {
return {
firstname: 'someName'
}
}
但由于您是从商店购买的,您可以使用 this.$store.getters[your_object]
访问特定的 getter 对象,因此我将删除 :value
绑定并使用 v-model
单独为此:
<div class="col-7">
<input class="form-control m-input" type="text" v-model="firstname">
</div>
<script>
export default {
data() {
return {
lang: "",
firstname: this.$store.getters.user.firstName
}
},
// ...
}
</script>
我正在寻找一种在同一个对象上同时使用 v-model
和 :value
的方法。
我收到这个错误:
:value="user.firstName"
conflicts withv-model
on the same element because the latter already expands to a value binding internally.
目的是将从 mapGetters
(来自一家商店)获得的值设置为默认值,并在用户提交修改时设置正确的值。 (在 onSubmit
)
<div class="form-group m-form__group row">
<label for="example-text-input" class="col-2 col-form-label">
{{ $t("firstname") }}
</label>
<div class="col-7">
<input class="form-control m-input" type="text" v-model="firstname" :value="user.firstName">
</div>
</div>
<script>
import { mapGetters, mapActions } from 'vuex';
export default {
data () {
return {
lang: "",
firstname: ""
}
},
computed: mapGetters([
'user'
]),
methods: {
...mapActions([
'updateUserProfile'
]),
onChangeLanguage () {
this.$i18n.locale = lang;
},
// Function called when user click on the "Save changes" btn
onSubmit () {
console.log('Component(Profile)::onSaveChanges() - called');
const userData = {
firstName: this.firstname
}
console.log('Component(Profile)::onSaveChanges() - called', userData);
//this.updateUserProfile(userData);
},
// Function called when user click on the "Cancel" btn
onCancel () {
console.log('Component(Profile)::onCancel() - called');
this.$router.go(-1);
}
}
}
</script>
您应该只使用 v-model,它会创建一个与脚本中值的双向绑定:更改 js 中的变量将更新输入元素,与输入元素交互将更新变量。
如果您想使用默认值,只需将变量设置为该值(无论它来自何处)。
Vue v-model
指令是 v-bind:value
和 v-on:input
的语法糖。 This alligator.io article 帮助我理解它是如何工作的。
所以基本上你的问题是 v-model
指令将 value
设置为 firstname
,同时你还明确地将 value
设置为 user.firstName
。
有很多方法可以解决这个问题。我认为一个快速而直接的解决方案是将 firstname
存储为数据变量(正如您已经在做的那样),然后只使用 v-model
,忽略 v-bind:value
.
然后,要将商店中的用户设置为默认用户名,您可以在 created
挂钩中将 fristname
设置为商店用户的用户名:
脚本:
<script>
import { mapGetters, mapActions } from 'vuex';
export default {
created() {
this.firstname = this.user.username; // is this right? no used to the map getters syntax, but this is the idea
},
data () {
return {
lang: "",
firstname: ""
}
},
computed: mapGetters([
'user'
]),
methods: {
...mapActions([
'updateUserProfile'
]),
onChangeLanguage () {
this.$i18n.locale = lang;
},
// Function called when user click on the "Save changes" btn
onSubmit () {
console.log('Component(Profile)::onSaveChanges() - called');
const userData = {
firstName: this.firstname
}
console.log('Component(Profile)::onSaveChanges() - called', userData);
//this.updateUserProfile(userData);
},
// Function called when user click on the "Cancel" btn
onCancel () {
console.log('Component(Profile)::onCancel() - called');
this.$router.go(-1);
}
}
}
</script>
通常您希望在对象本身上设置 v-model
的 "initial" 值,例如:
data() {
return {
firstname: 'someName'
}
}
但由于您是从商店购买的,您可以使用 this.$store.getters[your_object]
访问特定的 getter 对象,因此我将删除 :value
绑定并使用 v-model
单独为此:
<div class="col-7">
<input class="form-control m-input" type="text" v-model="firstname">
</div>
<script>
export default {
data() {
return {
lang: "",
firstname: this.$store.getters.user.firstName
}
},
// ...
}
</script>