123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- <template>
- <view class="wrap">
- <u-form :model="model" :rules="rules" ref="uForm" :errorType="errorType">
- <u-form-item :leftIconStyle="{color: '#888', fontSize: '32rpx'}" left-icon="account" label-width="120" :label-position="labelPosition" label="姓名" prop="name">
- <u-input :border="border" placeholder="请输入姓名" v-model="model.name" type="text"></u-input>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="性别" prop="sex">
- <u-input :border="border" type="select" :select-open="actionSheetShow" v-model="model.sex" placeholder="请选择性别" @click="actionSheetShow = true"></u-input>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="简介" prop="intro">
- <u-input type="textarea" :border="border" placeholder="请填写简介" v-model="model.intro" />
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="密码" prop="password">
- <u-input :password-icon="true" :border="border" type="password" v-model="model.password" placeholder="请输入密码"></u-input>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="确认密码" label-width="150" prop="rePassword">
- <u-input :border="border" type="password" v-model="model.rePassword" placeholder="请确认密码"></u-input>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="水果品种" label-width="150" prop="likeFruit">
- <u-checkbox-group @change="checkboxGroupChange" :width="radioCheckWidth" :wrap="radioCheckWrap">
- <u-checkbox v-model="item.checked" v-for="(item, index) in checkboxList" :key="index" :name="item.name">{{ item.name }}</u-checkbox>
- </u-checkbox-group>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="结算方式" prop="payType" label-width="150">
- <u-radio-group v-model="radio" @change="radioGroupChange" :width="radioCheckWidth" :wrap="radioCheckWrap">
- <u-radio shape="circle" v-for="(item, index) in radioList" :key="index" :name="item.name">{{ item.name }}</u-radio>
- </u-radio-group>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="所在地区" prop="region" label-width="150">
- <u-input :border="border" type="select" :select-open="pickerShow" v-model="model.region" placeholder="请选择地区" @click="pickerShow = true"></u-input>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="商品类型" prop="goodsType" label-width="150">
- <u-input :border="border" type="select" :select-open="selectShow" v-model="model.goodsType" placeholder="请选择商品类型" @click="selectShow = true"></u-input>
- </u-form-item>
- <u-form-item :rightIconStyle="{color: '#888', fontSize: '32rpx'}" right-icon="kefu-ermai" :label-position="labelPosition" label="手机号码" prop="phone" label-width="150">
- <u-input :border="border" placeholder="请输入手机号" v-model="model.phone" type="number"></u-input>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="验证码" prop="code" label-width="150">
- <u-input :border="border" placeholder="请输入验证码" v-model="model.code" type="text"></u-input>
- <u-button slot="right" type="success" size="mini" @click="getCode">{{codeTips}}</u-button>
- </u-form-item>
- <!-- 此处switch的slot为right,如果不填写slot名,也即<u-switch v-model="model.remember"></u-switch>,将会左对齐 -->
- <u-form-item :label-position="labelPosition" label="记住密码" prop="remember" label-width="150">
- <u-switch v-model="model.remember" slot="right"></u-switch>
- </u-form-item>
- <u-form-item :label-position="labelPosition" label="上传图片" prop="photo" label-width="150">
- <u-upload width="160" height="160"></u-upload>
- </u-form-item>
- </u-form>
- <view class="agreement">
- <u-checkbox v-model="check" @change="checkboxChange"></u-checkbox>
- <view class="agreement-text">
- 勾选代表同意uView的版权协议
- </view>
- </view>
- <u-button @click="submit">提交</u-button>
- <u-action-sheet :list="actionSheetList" v-model="actionSheetShow" @click="actionSheetCallback"></u-action-sheet>
- <u-select mode="single-column" :list="selectList" v-model="selectShow" @confirm="selectConfirm"></u-select>
- <u-picker mode="region" v-model="pickerShow" @confirm="regionConfirm"></u-picker>
- <u-verification-code seconds="60" ref="uCode" @change="codeChange"></u-verification-code>
- <view class="u-config-wrap">
- <view class="u-config-title u-border-bottom">
- 参数配置
- </view>
- <view class="u-config-item">
- <view class="u-item-title">label对齐方式</view>
- <u-subsection :list="['左边', '上方']" @change="labelPositionChange"></u-subsection>
- </view>
- <view class="u-config-item">
- <view class="u-item-title">边框</view>
- <u-subsection :current="borderCurrent" :list="['显示', '隐藏']" @change="borderChange"></u-subsection>
- </view>
- <view class="u-config-item">
- <view class="u-item-title">radio、checkbox样式</view>
- <u-subsection :list="['自适应', '换行', '50%宽度']" @change="radioCheckboxChange"></u-subsection>
- </view>
- <view class="u-config-item">
- <view class="u-item-title">错误提示方式</view>
- <u-subsection :list="['message', 'toast', '下划线', '输入框']" @change="errorChange"></u-subsection>
- </view>
- </view>
- </view>
- </template>
- <script>
- export default {
- data() {
- let that = this;
- return {
- model: {
- name: '',
- sex: '',
- likeFruit: '',
- intro: '',
- payType: '支付宝',
- agreement: false,
- region: '',
- goodsType: '',
- phone: '',
- code: '',
- password: '',
- rePassword: '',
- remember: false,
- photo: ''
- },
- selectList: [
- {
- value: '电子产品',
- label: '电子产品'
- },
- {
- value: '服装',
- label: '服装'
- },
- {
- value: '工艺品',
- label: '工艺品'
- }
- ],
- rules: {
- name: [
- {
- required: true,
- message: '请输入姓名',
- trigger: 'blur' ,
- },
- {
- min: 3,
- max: 5,
- message: '姓名长度在3到5个字符',
- trigger: ['change','blur'],
- },
- {
- // 此为同步验证,可以直接返回true或者false,如果是异步验证,稍微不同,见下方说明
- validator: (rule, value, callback) => {
- // 调用uView自带的js验证规则,详见:https://www.uviewui.com/js/test.html
- return this.$u.test.chinese(value);
- },
- message: '姓名必须为中文',
- // 触发器可以同时用blur和change,二者之间用英文逗号隔开
- trigger: ['change','blur'],
- },
- // 异步验证,用途:比如用户注册时输入完账号,后端检查账号是否已存在
- // {
- // trigger: ['blur'],
- // // 异步验证需要通过调用callback(),并且在里面抛出new Error()
- // // 抛出的内容为需要提示的信息,和其他方式的message属性的提示一样
- // asyncValidator: (rule, value, callback) => {
- // this.$u.post('/ebapi/public_api/index').then(res => {
- // // 如果验证出错,需要在callback()抛出new Error('错误提示信息')
- // if(res.error) {
- // callback(new Error('姓名重复'));
- // } else {
- // // 如果没有错误,也要执行callback()回调
- // callback();
- // }
- // })
- // },
- // }
- ],
- sex: [
- {
- required: true,
- message: '请选择性别',
- trigger: 'change'
- },
- ],
- intro: [
- {
- required: true,
- message: '请填写简介'
- },
- {
- min: 5,
- message: '简介不能少于5个字',
- trigger: 'change' ,
- },
- // 正则校验示例,此处用正则校验是否中文,此处仅为示例,因为uView有this.$u.test.chinese可以判断是否中文
- {
- pattern: /^[\u4e00-\u9fa5]+$/gi,
- message: '简介只能为中文',
- trigger: 'change',
- },
- ],
- likeFruit: [
- {
- required: true,
- message: '请选择您喜欢的水果',
- trigger: 'change',
- type: 'array',
- }
- ],
- payType: [
- {
- required: true,
- message: '请选择任意一种支付方式',
- trigger: 'change',
- }
- ],
- region: [
- {
- required: true,
- message: '请选择地区',
- trigger: 'change',
- }
- ],
- goodsType: [
- {
- required: true,
- message: '请选择商品类型',
- trigger: 'change',
- }
- ],
- phone: [
- {
- required: true,
- message: '请输入手机号',
- trigger: ['change','blur'],
- },
- {
- validator: (rule, value, callback) => {
- // 调用uView自带的js验证规则,详见:https://www.uviewui.com/js/test.html
- return this.$u.test.mobile(value);
- },
- message: '手机号码不正确',
- // 触发器可以同时用blur和change,二者之间用英文逗号隔开
- trigger: ['change','blur'],
- }
- ],
- code: [
- {
- required: true,
- message: '请输入验证码',
- trigger: ['change','blur'],
- },
- {
- type: 'number',
- message: '验证码只能为数字',
- trigger: ['change','blur'],
- }
- ],
- password: [
- {
- required: true,
- message: '请输入密码',
- trigger: ['change','blur'],
- },
- {
- // 正则不能含有两边的引号
- pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]+\S{5,12}$/,
- message: '需同时含有字母和数字,长度在6-12之间',
- trigger: ['change','blur'],
- }
- ],
- rePassword: [
- {
- required: true,
- message: '请重新输入密码',
- trigger: ['change','blur'],
- },
- {
- validator: (rule, value, callback) => {
- return value === this.model.password;
- },
- message: '两次输入的密码不相等',
- trigger: ['change','blur'],
- }
- ],
- },
- border: false,
- check: false,
- selectStatus: 'close',
- checkboxList: [
- {
- name: '荔枝',
- checked: false,
- disabled: false
- },
- {
- name: '香蕉',
- checked: false,
- disabled: false
- },
- {
- name: '橙子',
- checked: false,
- disabled: false
- },
- {
- name: '草莓',
- checked: false,
- disabled: false
- }
- ],
- radioList: [
- {
- name: '支付宝',
- checked: true,
- disabled: false
- },
- {
- name: '微信',
- checked: false,
- disabled: false
- },
- {
- name: '银联',
- checked: false,
- disabled: false
- },
- {
- name: '现金',
- checked: false,
- disabled: false
- }
- ],
- radio: '支付宝',
- actionSheetList: [
- {
- text: '男'
- },
- {
- text: '女'
- },
- {
- text: '保密'
- }
- ],
- actionSheetShow: false,
- pickerShow: false,
- selectShow: false,
- radioCheckWidth: 'auto',
- radioCheckWrap: false,
- labelPosition: 'left',
- codeTips: '',
- errorType: ['message'],
- };
- },
- onLoad() {
- },
- computed: {
- borderCurrent() {
- return this.border ? 0 : 1;
- }
- },
- onReady() {
- this.$refs.uForm.setRules(this.rules);
- },
- methods: {
- submit() {
- this.$refs.uForm.validate(valid => {
- if (valid) {
- if(!this.model.agreement) return this.$u.toast('请勾选协议');
- console.log('验证通过');
- } else {
- console.log('验证失败');
- }
- });
- },
- // 点击actionSheet回调
- actionSheetCallback(index) {
- uni.hideKeyboard();
- this.model.sex = this.actionSheetList[index].text;
- },
- // checkbox选择发生变化
- checkboxGroupChange(e) {
- this.model.likeFruit = e;
- },
- // radio选择发生变化
- radioGroupChange(e) {
- this.model.payType = e;
- },
- // 勾选版权协议
- checkboxChange(e) {
- this.model.agreement = e.value;
- },
- // 选择地区回调
- regionConfirm(e) {
- this.model.region = e.province.label + '-' + e.city.label + '-' + e.area.label;
- },
- // 选择商品类型回调
- selectConfirm(e) {
- this.model.goodsType = '';
- e.map((val, index) => {
- this.model.goodsType += this.model.goodsType == '' ? val.label : '-' + val.label;
- })
- },
- borderChange(index) {
- this.border = !index;
- },
- radioCheckboxChange(index) {
- if(index == 0) {
- this.radioCheckWrap = false;
- this.radioCheckWidth = 'auto';
- } else if(index == 1) {
- this.radioCheckWrap = true;
- this.radioCheckWidth = 'auto';
- } else if(index == 2) {
- this.radioCheckWrap = false;
- this.radioCheckWidth = '50%';
- }
- },
- labelPositionChange(index) {
- this.labelPosition = index == 0 ? 'left' : 'top';
- },
- codeChange(text) {
- this.codeTips = text;
- },
- // 获取验证码
- getCode() {
- if(this.$refs.uCode.canGetCode) {
- // 模拟向后端请求验证码
- uni.showLoading({
- title: '正在获取验证码',
- mask: true
- })
- setTimeout(() => {
- uni.hideLoading();
- // 这里此提示会被this.start()方法中的提示覆盖
- this.$u.toast('验证码已发送');
- // 通知验证码组件内部开始倒计时
- this.$refs.uCode.start();
- }, 2000);
- } else {
- this.$u.toast('倒计时结束后再发送');
- }
- },
- errorChange(index) {
- if(index == 0) this.errorType = ['message'];
- if(index == 1) this.errorType = ['toast'];
- if(index == 2) this.errorType = ['border-bottom'];
- if(index == 3) this.errorType = ['border'];
- }
- }
- };
- </script>
- <style scoped lang="scss">
- .wrap {
- padding: 30rpx;
- }
- .agreement {
- display: flex;
- align-items: center;
- margin: 40rpx 0;
- .agreement-text {
- padding-left: 8rpx;
- color: $u-tips-color;
- }
- }
- </style>
|