123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- <template>
- <view class="form-container">
- <view class="form-box" >
- <block v-for="(item,index) in formDate" :key="item.rules.name">
- <!-- 单行文本框 -->
- <view class='line' v-if="item.type=='text' || item.type=='number' || item.type=='password'">
- <view :class="item.rules.verify.indexOf('req')!=-1 ? 'line-left' :'p-l14 line-left' "><text class='colorRed' v-if="item.rules.verify.indexOf('req')!=-1">*</text>{{item.label}}</view>
- <!-- 发送验证码 -->
- <view class="line-right send-code-box" v-if="item.rules.name=='yzm'">
- <input :type="item.type" class="input" placeholder-class="plaClass" :placeholder='item.placeholder' v-model="item.rules.value" @input="inputVal(index)"></input>
- <view class="send-code" @click="sendCode()" :style="sendColor">{{codeFont}}</view>
- </view>
- <!-- 普通输入框 -->
- <view class="line-right" v-else>
- <input :type="item.type" class="input" placeholder-class="plaClass" :placeholder='item.placeholder' v-model="item.rules.value" @input="inputVal(index)"></input>
- </view>
- </view>
- <!-- 下拉选择-->
- <view class='line' v-else-if="item.type=='radio'">
- <view :class="item.rules.verify.indexOf('req')!=-1 ? 'line-left' :'p-l14 line-left' "><text class='colorRed' v-if="item.rules.verify.indexOf('req')!=-1">*</text>{{item.label}}</view>
- <view class="line-right">
- <input type="text" class="input" placeholder-class="plaClass" :placeholder='item.placeholder' v-model="item.rules.value"
- @click="selectInput(index)"></input>
- <view class="select-icon"> </view>
- </view>
- </view>
- <!-- 多行文本框 -->
- <view class="textarea-box" v-else-if="item.type=='textarea'">
- <view :class="item.rules.verify.indexOf('req')!=-1 ? '' :'p-l14 ' "><text class='colorRed' v-if="item.rules.verify.indexOf('req')!=-1">*</text>{{item.label}}</view>
- <view class="line-right">
- <textarea rows="" cols="" placeholder-class="plaClass" :placeholder='item.placeholder' v-model="item.rules.value" @input="inputVal(index)">
- </textarea>
- </view>
- </view>
- <!-- 上传图片 -->
- <view class="img-box" v-else-if="item.type=='image'">
- <view :class="item.rules.verify.indexOf('req')!=-1 ? 'img-label' :'p-l14 img-label' "><text class='colorRed' v-if="item.rules.verify.indexOf('req')!=-1">*</text>{{item.label}}</view>
- <view class="line-right">
- <view v-if="item.updateImg" class="update-img-box">
- <view class="update-img-box2">
- <img :src="item.rules.value" alt="" mode="aspectFill" class="update-img">
- <img src="/static/img/delete_img.png" alt="" class="close-img" @click="deleteImg(index)">
- </view>
- </view>
- <view v-if="!item.updateImg" class="update-btn-box">
- <img src="/static/img/update_btn.png" alt="" mode="aspectFill" @click="chooseImage(index)">
- </view>
- </view>
- </view>
- </block>
- </view>
- <view class="select-modal" v-if="show">
- <view class="select-bg" @click="cancel"></view>
- <view class="select-box" :animation="animationData">
- <view class="select-title">
- <view class="font32 color-999" @click="cancel">取消</view>
- <view class="font32 color-orange" @click="sure">确定</view>
- </view>
- <view>
- <block v-for="(item,index) in selectBox" :key="index">
- <view class="select-item" @click="selectItem(item.value,index)">{{item.value}} <i class="select-flag" v-if="item.flag"></i></view>
- </block>
- </view>
- </view>
- </view>
- </view>
- </template>
- <script>
- export default {
- name: 'activeForm',
- data() {
- return {
- submitData: "",
- show: false,
- animationData: {},
- selectBox:[],
- currentSelectIndex:"",
- currentSelectValue:"",
- codeFont:"获取验证码",
- wait:60,
- isSend:false,
- sendColor:"color:#ff5b01"
- }
- },
- props: {
- formDate:{
- type:Array,
- default:function(){
- return []
- }
- }
- },
- methods: {
- //input输入框的值传给父组件
- inputVal:function(index){
- this.$emit("input-val",JSON.stringify({
- val:this.formDate[index].rules.value,
- index:index
- }))
- },
- // 选择下拉框
- selectInput: function(index) {
- this.selectBox = [];
- this.currentSelectIndex="";
- this.currentSelectValue="";
- this.currentSelectIndex=index;
- for (var i = 0; i < this.formDate[index].selectVal.length; i++) {
- var selectVal = {
- value: this.formDate[index].selectVal[i],
- flag: false
- }
- if (this.formDate[index].selectVal[i] == this.formDate[index].rules.value) { //判断上次选中的那个
- selectVal.flag = true;
- }
- this.selectBox.push(selectVal)
- }
- this.show = true;
- var animation = uni.createAnimation({
- duration: 300,
- timingFunction: 'ease',
- })
- this.animation = animation;
- animation.bottom("0").step()
- this.animationData = this.animation.export()
- this.$emit("select-input-btn",index);
- },
- // 上传图片
- chooseImage: function(index) {
- var that=this;
- uni.chooseImage({
- count: 1,
- sizeType: ['compressed'],
- sourceType: ['album'],
- success: (res) => {
- this.$emit("choose-image-btn",JSON.stringify(
- {
- value:res.tempFilePaths[0],
- index:index,
- }
- ))
- },
- fail: (err) => {
- console.log('chooseImage fail', err)
- }
-
- })
- },
- // 删除图片
- deleteImg:function(index){
- this.$emit("delete-img-btn",index)
- },
- // 取消
- cancel: function() {
- var that = this;
- var animation = uni.createAnimation({
- duration: 300,
- timingFunction: 'ease',
- })
- this.animation = animation;
- animation.bottom("-1000upx").step()
- this.animationData = this.animation.export()
- setTimeout(function() {
- that.show = false;
- }, 200)
- },
- // 确定
- sure: function() {
- this.$emit("sure-btn",JSON.stringify({
- currentSelectIndex:this.currentSelectIndex,
- currentSelectValue:this.currentSelectValue
- }))
- console.log(this.formDate)
- this.cancel();
- },
- //选择值
- selectItem: function(value, index) {
- this.currentSelectValue = value;
- for (var i = 0; i < this.selectBox.length; i++) {
- this.$set(this.selectBox[i], "flag", false);
- }
- this.selectBox[index].flag = true;
- },
- // 发送验证码
- sendCode:function(){
- var that=this;
- var setTime=0;
- if(!that.isSend){
- that.isSend=true;
- setTime=setInterval(function(){
- that.wait--;
- that.sendColor="color:#999";
- that.codeFont=that.wait+"重新发送";
- if(that.wait==0){
- clearInterval(setTime);
- that.codeFont="获取验证码";
- that.isSend=false;
- that.wait=60;
- that.sendColor="color:#ff5b01";
- }
- },1000)
- }
-
- }
- }
- }
- </script>
- <style lang="scss">
- // 弹框
- .select-modal {
- position: fixed;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- z-index: 300000;
- .select-bg{
- width: 100%;
- height: 100%;
- background: rgba(0, 0, 0, 0.3);
- }
- .select-box {
- position: absolute;
- left: 0;
- bottom: -1000upx;
- width: 100%;
- background: #fff;
- max-height: 50%;
- // height: 0%;
- overflow: auto;
- .select-title {
- display: flex;
- justify-content: space-between;
- height: 80upx;
- background: #f5f5f5;
- line-height: 80upx;
- padding: 0 30upx;
- }
- .select-item {
- font-size: 28upx;
- color: #333;
- border-bottom: 1px solid #eee;
- height: 75upx;
- line-height: 75upx;
- padding: 0 30upx;
- i {
- display: block;
- float: right;
- border-bottom: 4upx solid #1ca032;
- border-right: 4upx solid #1ca032;
- width: 12upx;
- height: 26upx;
- transform: rotate(45deg);
- margin-top: 24.5upx;
- }
- }
- }
- @keyframes mymove {
- 0% {
- max-height: 10%;
- }
- 100% {
- max-height: 50%;
- }
- }
- /*Safari 和 Chrome:*/
- @-webkit-keyframes mymove {
- 0% {
- max-height: 10%;
- }
- 100% {
- max-height: 50%;
- }
- }
- }
- // 下拉icon
- .select-icon {
- // display: block;
- float: right;
- border-bottom: 2upx solid #999;
- border-right: 2upx solid #999;
- width: 16upx;
- height: 16upx;
- transform: rotate(-45deg);
- margin-right: 10upx;
- }
- .color-orange {
- color: #ff5b01;
- }
- .color-999 {
- color: #999;
- }
- .font32 {
- font-size: 32upx;
- }
- .plaClass {
- color: #dbdbdb;
- }
- .form-container {
- /* padding: 0 30upx; */
- .form-box {
- width: 100%;
- box-sizing: border-box;
- }
- .colorRed {
- color: red;
- }
- .img-box {
- border-bottom: 1px solid #ededed;
- padding: 30upx 0;
- .update-img-box{
- border: 1px solid #ededed;
- display: flex;
-
- .update-img{
- width: 140upx;
- height: 140upx;
- }
- }
- .update-img-box2{
- overflow: hidden;
- display: flex;
- }
- .update-img-box,.update-btn-box{
- width: 140upx;
- height: 140upx;
- position:relative;
- margin-top: 20upx;
- }
- .update-img-box .close-img{
- width: 40upx;
- height: 40upx;
- position: absolute;
- right: -12upx;
- top: -16upx;
- background:#fff;
- border-radius: 50%;
- }
- img{
- width: 140upx;
- height: 140upx;
- object-fit: cover;
- }
- }
- .line-right {
- flex: 1;
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: space-between;
- position: relative;
-
- }
- .send-code-box{
- .send-code{
- font-size: 28upx;
- padding: 0;
- white-space: nowrap;
- // width: 60%;
- //color:#ff5b01;
- height: 90upx;
- line-height: 90upx;
- cursor: pointer;
- }
- }
- .line-left {
- display: flex;
- /* width: 22%; */
- width: 35%;
- align-items: center;
- height: 100%;
- font-size: 28upx;
- color: #333;
- box-sizing: border-box;
- }
- .img-label{
- width: 100%;
- height: 100%;
- font-size: 28upx;
- color: #333;
- box-sizing: border-box;
- }
- .p-l14{
- padding-left: 14upx;
- }
- .textarea-box{
- // display: flex;
- border-bottom: 1px solid #ededed;
- padding-top: 20upx;
- // align-items: center;
- textarea{
- height: 150upx;
- font-size: 28upx;
- color:#333;
- width: 100%;
- margin-top: 20upx;
- }
- }
- .line {
- margin-top: 30upx;
- height: 100upx;
- width: 100%;
- margin: 0 auto;
- border-bottom: 1px solid #ededed;
- display: flex;
- overflow: hidden;
- .input {
- padding-right: 20upx;
- height: 100%;
- width: 100%;
- text-align: left;
- font-size: 28upx;
- color: #333;
- border: none;
- overflow: hidden;
- text-overflow: ellipsis;
- outline: none;
- }
- }
- }
- </style>
|