vue学习笔记14
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了vue学习笔记14,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6024字,纯文字阅读大概需要9分钟。
内容图文
分步表单 和 自定义表单控件
结合前面所了解到的内容。这里分步分三个路由来实现。
先创建一个store的module。保存我们需要数据,然后引入到store的index.js中
form.js
1 import router from "../../router"; 2 import request from "../../utils/request"; 3 import { notification } from "ant-design-vue"; 4 5 const state = { 6 step: { 7 payAccount: "12345", 8 receiverAccount: { 9 type: "bank", 10 number: "" 11 } 12 } 13}; 1415 const actions = { 16 async submitStepForm({ commit }, payload) { 17if (payload.payload.password == 123123) { 18 let res = await request({ 19 url: "api/form", 20 method: "POST", 21 data: payload.payload 22 }); 23if (res.data.message == "成功") { 24 commit("saveStepFormData", payload); 25 router.push("/form/step-from/result"); 26 } 27 } else { 28 notification.error({ 29 message: "密码错误" 30 }); 31 } 32 } 33}; 3435 const mutations = { 36 saveStepFormData(state, { payload }) { 37 state.step = { 38 ...state.step, 39 ...payload 40 }; 41 } 42}; 43 export default { 44 namespaced: true, 45 state, 46 actions, 47 mutations 48 };
这里的request也是用的之前的js函数模拟数据。
function form(method) { let res = null; switch (method) { case "POST": res = { message: "成功" }; break; default: res = null; } return res; } module.exports = form;
写第一步
<template> <div> <a-form layout="horizontal" :form="form"> <a-form-item> <a-form-item label="付款账户" :label-col="formItemLayout.labelCol" :wrapperCol="formItemLayout.wrapperCol" > <a-input v-decorator="[‘payAccount‘,{ initialValue:step.payAccount, rules:[ {required:true,message:‘请输入付款账户‘} ] }]" placeholder="请输入内容" /> </a-form-item> <a-form-item label="收款账户" :label-col="formItemLayout.labelCol" :wrapperCol="formItemLayout.wrapperCol" > <ReceiverAccount v-decorator="[‘receiverAccount‘,{ initialValue:step.receiverAccount, rules:[ {required:true,message:‘请输入收款账户‘, validator: (rule,value,callback) => { if(value && value.number){ callback() } else { callback(false) } }} ] }]" placeholder="请输入内容" /> </a-form-item> <a-form-item> <a-button type="primary" @click="handleSubmit">下一步</a-button> </a-form-item> </a-form-item> </a-form> </div> </template> <script> import ReceiverAccount from "@/components/ReceiverAccount"; export default { data() { this.form = this.$form.createForm(this); return { formItemLayout: { labelCol: { span: 4 }, wrapperCol: { span: 14 } } }; }, components: { ReceiverAccount }, computed: { step() { returnthis.$store.state.form.step; } }, methods: { handleSubmit() { const { form, $router, $store } = this; form.validateFields((err, values) => { if (!err) { $store.commit({ type: "form/saveStepFormData", payload: values }); $router.push("/form/step-from/comfirm"); } }); } } }; </script> <style></style>
第二步
<template> <div> <a-form layout="horizontal" :form="form"> <a-form-item> <a-form-item label="付款账户" :label-col="formItemLayout.labelCol" :wrapperCol="formItemLayout.wrapperCol" >{{step.payAccount}}</a-form-item> <a-form-item label="收款账户" :label-col="formItemLayout.labelCol" :wrapperCol="formItemLayout.wrapperCol" > <span style="color:#a12221">{{step.receiverAccount.type == ‘alipay‘? ‘支付宝‘ : ‘银行卡‘}}</span> <span>: {{step.receiverAccount.number}}</span> </a-form-item> <a-form-item label="账户密码" :label-col="formItemLayout.labelCol" :wrapperCol="formItemLayout.wrapperCol" > <a-input type="password" v-decorator="[‘password‘,{ rules:[ {required:true,message:‘请输入付款账户密码‘} ] }]" placeholder="请输入内容" /> </a-form-item> <a-form-item> <a-button style="margin-right:15px" type="dashed" @click="handleBack">上一步</a-button> <a-button type="primary" @click="handleSubmit">提交</a-button> </a-form-item> </a-form-item> </a-form> </div> </template> <script> export default { data() { this.form = this.$form.createForm(this); return { formItemLayout: { labelCol: { span: 4 }, wrapperCol: { span: 14 } } }; }, computed: { step() { console.log(this.$store.state.form.step); returnthis.$store.state.form.step; } }, methods: { handleSubmit() { const { form, $store, step } = this; form.validateFields((err, values) => { if (!err) { $store.dispatch({ type: "form/submitStepForm", payload: { ...step, ...values } }); } }); }, handleBack() { this.$router.push("/form/step-from/info"); } } }; </script> <style></style>
第三步
<template> <div> <h3>操作成功,预计两小时内到账</h3> <div>{{time}}秒后将自动返回首页</div> </div> </template> <script> export default { data() { return { time: 3 }; }, mounted() { var timer = setInterval(() => { this.time--; if (this.time <= 0) { clearInterval(timer); this.$router.replace("/form/step-from/info"); } }, 1000); } }; </script> <style></style>
效果图:
在第一步中,有使用到自定义组件,插入到表单中,并且使用了表单自动校验。在antd的官网上,有相关的解释。
自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件遵循以下的约定:
- 提供受控属性
value
或其它与 valuePropName-参数) 的值同名的属性。 - 提供
onChange
事件或 trigger-参数) 的值同名的事件。 - 不能是函数式组件。
组件的代码
<template> <div> <a-input-group compact> <a-select v-model="type" style="width :130px" @change="handleTypeChange"> <a-select-option value="alipay">支付宝</a-select-option> <a-select-option value="bank">银行卡</a-select-option> </a-select> <a-input v-model="number" style="width: calc(100% - 130px)" @change="handleInputChange" placeholder="请输入账户" /> </a-input-group> </div> </template> <script> export default { props: { value: { type: Object } }, data() { const { type, number } = this.value || {}; return { type: type || "alipay", number: number || "" }; }, watch: { value(val) { Object.assign(this, val); } }, methods: { handleTypeChange(val) { this.$emit("change", { ...this.value, type: val }); }, handleInputChange(e) { this.$emit("change", { ...this.value, number: e.target.value }); } } }; </script> <style> </style>
原文:https://www.cnblogs.com/wangnothings/p/12596311.html
内容总结
以上是互联网集市为您收集整理的vue学习笔记14全部内容,希望文章能够帮你解决vue学习笔记14所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。