uni app 自定义 带popup弹窗的input组件

工作需要。自定义了个带popup弹窗的input组件。此组件满足个人需求,不喜勿喷。应该可以看明白怎么回事,也能自己改改,所以就不要联系了,点赞收藏就好

<template>
	<view class="dialog_main">
		<input v-model="inputvalueClone" class="select_input" placeholder-class="down_select_input_placeholder"
			placeholder="请输入或选择" @focus="input_focus" @input="input_value" />
		<view class="select_mian" v-if="showPickerClone">
			<view class="button_main">
				<text></text>
				<text class="button_name" @click="qd_click">确定</text>
			</view>
			<scroll-view v-if="showPickerClone" class="scroll_y" :scroll-y="true">
				<view class="list_main" :id="index" v-for="(item, index) in datalistClone" :key="index">

					<text v-if="!item.ishow" @click="item_click(item)" class="item_name">{{ item[showkey]  }}</text>
				</view>
			</scroll-view>
		</view>




	</view>
</template>

<script>
	import myclient from '../../utils/myclient.js'
	import utils from '../../utils/utils.js';
	export default {
		data() {
			return {
				inputvalueClone: "",
				showPickerClone: false,
				datalistClone: [],
				selectedIndex: 0, // 当前选中的索引  
			};
		},
		/**
		 * 组件的属性列表
		 */
		props: {

			showkey: {
				type: String,
				default: ''
			},
			clienturl: {
				type: String,
				default: ''
			},


			paramsvalue: {
				type: String,
				default: ''
			},
			params: {
				type: Object,
				default: ''
			},

			reqmethod: {
				type: String,
				default: 'POST'
			},
			datapath: {
				type: String,
				default: ''
			},
			inputvalue: {
				type: String,
				default: ''
			},



			callback: {
				type: String,
				default: ''
			}
		},
		/**
		 * 组件的方法列表
		 */
		methods: {
			input_value: function(e) {
				var value = e.detail.value
				this.inputvalueClone = value
				if (value.length == 0) {

					this.datalistClone = utils.setShow(this.datalistClone, true)


				} else {
					for (var i = 0; i < this.datalistClone.length; i++) {
						this.datalistClone[i].ishow = true

						if (this.datalistClone[i][this.showkey].indexOf(value) >= 0) {
							this.datalistClone[i].ishow = false


						}
					}
					this.$forceUpdate()
				}


			},
			input_focus: function() {
			 
				var that = this
				myclient.callGetorPost(this.clienturl, this.reqmethod, this.params, false, function(res) {


					var paths = that.datapath.split('.');
					var datas = res;

					for (let i = 0; i < paths.length; i++) {
						datas = datas[paths[i]];

					}

					if (that.inputvalueClone.length == 0) {

						that.datalistClone = utils.setShow(datas, true)


					} else {
						for (var i = 0; i < datas.length; i++) {
							datas[i].ishow = true

							if (datas[i][that.showkey].indexOf(that.inputvalueClone) >= 0) {
								datas[i].ishow = false


							}
						}
						that.datalistClone = datas
					}


					that.showPickerClone = true
				})


			},

			item_click(e) {
				this.showPickerClone = false
				this.$emit('callBack', {
					detail: e,
					value: this.inputvalueClone
				});
			},
			qd_click: function() {
				this.showPickerClone = false
				this.$emit('callBack', {

					value: this.inputvalueClone
				});
			}

		},
		watch: {
			inputvalue: {
				handler: function(newval, oldval) {
					this.inputvalueClone = newval
				},
				immediate: true
			}

		}
	};
</script>

<style lang="scss" scoped>
	@function tovmin($rpx) {
		//$rpx为需要转换的字号
		@return #{$rpx * 100 / 750}vmin;
	}

	.dialog_main {
		width: 100vw;
		display: flex;
		flex-direction: column;
	}

	.select_mian {
		width: 80vw;
		min-height: 10vh;
		max-height: 50vh;
		box-shadow: 0rpx 0rpx 12rpx 0rpx rgba(7, 165, 166, 0.11);
		z-index: 2;
		border: solid 2rpx #efefef;
	}

	.button_main {
		width: 100%;
		height: 80rpx;
		display: flex;
		flex-direction: row;
		border-bottom: #00a99d dotted 2rpx;
		justify-content: space-between;
	}

	.button_name {
		color: #00a99d;
		display: flex;
		align-items: center;
		text-align: center;
		justify-content: center;
		width: 100rpx;
		height: 100%;

	}

	/* 在这里添加你的样式 */
	.scroll_y {
		width: 100%;
		height: 100%;
	}

	.list_main {
		width: 100vw;

		display: flex;
		flex-direction: column;
		align-items: center;
		vertical-align: center;
	}

	.item_name {
		font-size: 28;
		padding-top: 5rpx;
		padding-bottom: 5rpx;
		width: 100%;
		min-height: tovmin(80);
		display: flex;
		align-items: center;
		justify-content: center;
		text-align: left;

		margin-right: tovmin(32);
		color: #333;
		font-weight: 600;
		overflow-y: auto;
		overflow-x: scroll;
		align-items: center;
		border-bottom: solid #efefef 2rpx;
		white-space: normal;
		word-break: break-all;
		word-wrap: break-word;
	}

	.select_input {

		color: #333;

		margin-bottom: 10rpx;
		padding: 0 20px 0px 0px;
		font-size: 14px;

		flex: 1;
		font-weight: 600;


	}
</style>

讲一下:

        myclient 封装的网络请求

        utils 是封装的工具类,setshow 是给各个对象添加一个字段isshow  用户对象是否展示出来

        showkey 列表中要展示的字段,比如name

        clienturl  要访问的接口获取列表数据

        paramsvalue 输入框输入的值放在接口参数的那个字段  比如keyword  //本示例中么有用此字段的后面会加上

        params   接口参数

        reqmethod 接口请求方式  GET  POST

        datapath 接口返回的数据取支路径 例如data.data.list

        inputvalue 输入框默认值,也就是 keyword的默认值例如 params={keyword:5} 那么 inputvalue=5

        callback:点确定或 列表回调

使用:

        要使用的页面 增加

        import inputselectVue from './component/inputselect.vue';

        components: {
           
            inputselectVue,

        },


         <inputselectVue class="select_input" showkey="strname"
                 :clienturl="strurl" :params="{keyword:0}" reqmethod="POST"
                  datapath="data.data.list" :inputvalue=" strname"
                   @callBack="name_callback">
          </inputselectVue>

        name_callback: function(e) {
                console.log(JSON.stringify(e))

                if (e.detail) {

                    this.strname= e.detail.strname;

                } else {
                     this.strname= e.detail.value;  

                }

                this.$forceUpdate()
        },

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值