123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- // components/w-picker/index.ts
- // 组件不支持简单的双向绑定,需要使用input和confirm事件来实现。
- Component({
- options: {
- multipleSlots: true,
- styleIsolation: "shared",
- },
- /**
- * 组件的属性列表
- */
- properties: {
- value: {
- type: [String, Number, Array] as any,
- value: "",
- observer: "_value",
- },
- /** 是否显示 */
- show: {
- type: Boolean,
- value: false,
- observer: "_show",
- },
- /**
- * 列数据
- * @example 单列 [{ text: a, value: 1 }, { text: b, value: 2 }]
- * @example 多列 [{ values: [{ text: a, value: 1 }, { text: b, value: 2 }], defaultIndex: 0 }, { values: [{ text: a, value: 1 }, { text: b, value: 2 }], defaultIndex: 0 }]
- */
- columns: {
- type: Array as any,
- value: [],
- observer: "_columns",
- },
- zIndex: {
- type: Number,
- value: 100
- },
- /**
- * 可见的选项个数
- */
- visibleItemCount: {
- type: Number,
- value: 6,
- },
- itemHeight: {
- type: Number,
- value: 46,
- },
- placeholder: {
- type: String,
- value: '请输入搜索关键词'
- }
- },
- /**
- * 组件的初始数据
- */
- data: {
- isMulti: false, // 是否多列
- innerShow: false,
- showAfterLeave: false,
- innerValue: "" as any, // 单列时为string, 多列为array
- defaultIndex: 0, // 默认选中的index 单行显示的
- },
- /**
- * 组件的方法列表
- */
- methods: {
- onSubmit(event: any) {
- const detail = event.detail || {};
- if(this.data.isMulti) {
- const values: any = [];
- detail.value.forEach((item: any) => {
- values.push(item.value)
- })
- this.setData({
- show: false,
- value: values,
- });
- this.triggerEvent("confirm", detail);
- this.triggerEvent("input", values);
- } else {
- this.setData({
- show: false,
- value: detail.value.value,
- });
- this.triggerEvent("confirm", detail);
- this.triggerEvent("input", detail.value.value);
- }
- },
- onChange(event: any) {
- const detail = event.detail.value;
- this.triggerEvent("change", detail);
- },
- onClose() {
- this.triggerEvent("cancel");
- },
- onAfterLeave() {
- this.setData({
- showAfterLeave: true,
- });
- },
- onBeforeEnter() {
- this.setData({
- showAfterLeave: false,
- });
- },
- _show() {
- // 单行显示 需要设置默认选中的index
- let defaultIndex = 0;
- let columns = [...this.data.columns];
- if (this.data.show) {
- if (!this.data.isMulti) {
- // 单行显示
- this.data.columns.forEach((item: any, index: number) => {
- if (item.value === this.data.value) {
- defaultIndex = index;
- }
- });
- } else {
- // 多行显示
- columns.forEach((item: any, index: number) => {
- item.values.forEach((value: any, valueIndex: number) => {
- if (value.value === this.data.value[index]) {
- item.defaultIndex = valueIndex;
- }
- });
- });
- }
- }
- this.setData(
- {
- defaultIndex,
- columns,
- },
- () => {
- this.setData({
- innerShow: this.data.show,
- });
- }
- );
- },
- _value() {
- // console.log(this.data, "value");
- this.setData({
- innerValue: this.data.value,
- });
- },
- _columns() {
- // 判断是多行还是单行
- if (this.data.columns[0] && this.data.columns[0].values) {
- this.setData({
- isMulti: true,
- });
- } else {
- this.setData({
- isMulti: false,
- });
- }
- }
- },
- });
|