我使用的是 vuejs-向导 为了创建注册页面,我在组件中的每个标签都是这样的。
<form-wizard color="#fcab1a" title="" subtitle="" finish-button-text="Register">
<tab-content title="Personal Info" icon="icon-location3 fa-2x">
<personal-info></personal-info>
</tab-content>
<tab-content title="Contact Info" icon="icon-box fa-2x">
<contact-info></contact-info>
</tab-content>
<tab-content title="Address" icon="icon-alarm fa-2x">
<address></address>
</tab-content>
</form-wizard>
<template>
<div class="card">
<div class="card-header">
<h5 class="card-title">Personal Info</h5>
</div>
<div class="card-body">
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Full Name <span class="text-danger">*</span></label>
<input type="text" value="" class="form-control" v-model="name" />
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Age <span class="text-danger">*</span></label>
<input type="number" value="" class="form-control" v-model="age" />
</div>
</div>
</div>
</div>
</div>
</template>
<template>
<div class="card">
<div class="card-header">
<h5 class="card-title">Contact Info</h5>
</div>
<div class="card-body">
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Mobile <span class="text-danger">*</span></label>
<input type="text" value="" class="form-control" v-model="mobile" />
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Email <span class="text-danger">*</span></label>
<input
type="number"
value=""
class="form-control"
v-model="email"
/>
</div>
</div>
</div>
</div>
</div>
</template>
我的问题是,提交表格的最佳方式是什么,我需要vuex来存储状态,还是有更好的方式?
我的问题是,我需要vuex来存储状态,还是有更好的方法?
答案取决于各种因素。例如,你是否已经使用了Vuex,应用程序的大小,应用程序的可测试性,甚至是字段是如何被验证的(异步验证)。
当它是一个简单的应用程序,而且我只有直接的父=>子关系时,我倾向于跳过添加Vuex作为依赖关系。但我主要是处理SPA,所以我通常会使用它)YMMV。
在这种情况下,这就需要在父类中定义字段。然后为每个值添加道具和发射器到子代,并在父代上添加一个监听器。不过当你开始添加更多的字段时,你可能会发现这很乏味,于是选择在对象中以组或整体的方式传递字段(只在tab中选择你需要的字段),然后你可以实现你自己的 v-model
中的标签组件,这可以使它很容易地将对象传递到周围
如果您使用的是最新的Vue版本(2.6+),您可以使用vue.observable在多个组件之间共享一个存储,而不需要Vuex的钟声。
有一个 好文章 其中展示了如何用它来创建一个vuex克隆,但实际上要创建一个符合你需求的商店要比这简单得多。如果你对如何实现它感兴趣,请在评论中告诉我,我可以描述它。
其实就这么简单
创建一个 store.js
文件中加入...
import Vue from 'vue';
const store = Vue.observable({
name: null,
email: null,
age: null,
mobile: null,
});
export default store;
然后在任何你想访问它的组件中,在创建过程中添加存储。
import store from "../store";
export default {
name: "PersonalInfo",
created() {
this.$store = store;
}
};
现在,所有的商店都可以在模板中使用,通过 $store
<input type="text" value class="form-control" v-model="$store.name">
你失去了Vuex提供的好处,比如在突变上的 "时间旅行"。因为你没有处理通量模式(vuex)所要处理的规模,所以我会在这种规模的应用中使用这种解决方案。
雅你应该只用vuex,它结合了像数据,这样就不会分散在多个文件中。如果你要把这些信息发回你的后端,它使大多数后端连接在一个地方更容易.没有向导的事情,我用这样的商店重新做了你的代码。注意计算属性而不是使用数据。通过做为一个计算属性,你不必写任何代码来改变存储在商店里面的变量。
Personal.vue
<template>
<div class="card">
<div class="card-header">
<h5 class="card-title">Personal Info</h5>
</div>
<div class="card-body">
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Full Name <span class="text-danger">*</span></label>
<input
type="text"
value=""
class="form-control"
v-model="register.name"
/>
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Age <span class="text-danger">*</span></label>
<input
type="number"
value=""
class="form-control"
v-model="register.age"
/>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
computed: {
register() {
return this.$store.state.register;
},
},
};
</script>
联系我们
<template>
<div class="card">
<div class="card-header">
<h5 class="card-title">Contact Info</h5>
</div>
<div class="card-body">
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Mobile <span class="text-danger">*</span></label>
<input
type="text"
value=""
class="form-control"
v-model="register.mobile"
/>
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Email <span class="text-danger">*</span></label>
<input
type="number"
value=""
class="form-control"
v-model="register.email"
/>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
computed: {
register() {
return this.$store.state.register;
},
},
methods: {
submit() {
this.$store.dispatch("register", {
person: this.register,
});
},
},
};
</script>
<style></style>
storeindex.js
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export default new Vuex.Store({
state: {
register: {},
},
actions: {
// register({commit}, data){
//put in some stuff here.
//},
},
});
如果你决定走store路线,你所要做的就是1.npm安装vuex2.在你的src文件夹里面添加一个名为store的文件夹3.添加一个名为index.js的文件4.进入main.js并添加这行 "import store from ".store"; "5.在说new "Vue({"的地方添加 "store "这将注册它。
Vuex是超级简单的,当你的项目变得更大时,它让生活变得更加简单。
.sync修改器为道具提供了双向绑定的模式,你可以在这里阅读一下。https:/vuejs.orgv2guidecomponents-custom-events.html#sync-Modifier。.
在父组件中,你可以这样使用.sync修饰符。
<ChildComponent :name.sync="parentNameProperty" />
...
data: () => ({ parentNameProperty: '' }),
...
然后在子组件中,你接收name作为prop,然后你可以通过使用watch或者方法,发出一个事件来更新父组件中的值。
...
props: {
name: {
type: String,
default: ''
}
}
...
this.$emit(update:parentNameProperty, newValue)
...
Vuex是一种处理状态的好方法,但对于小型应用来说,使用上述模式是可以的。