1.5.1 • Published 1 year ago

@wines/filterbar v1.5.1

Weekly downloads
-
License
-
Repository
-
Last release
1 year ago

@wines/filterbar

FilterBar 筛选栏

筛选栏组件。

使用指南

在 page.json 中引入组件

{
  "navigationBarTitleText": "wux-filterbar",
  "usingComponents": {
    "wux-filterbar": "@wines/filterbar"
  }
}

示例

<view class="page">
	<view class="page__hd">
		<view class="page__title">FilterBar</view>
		<view class="page__desc">筛选栏</view>
	</view>
	<view class="page__bd">
		<wux-filterbar
		 items="{{ items }}"
		 bind:change="onChange"
		 bind:open="onOpen"
		 bind:close="onClose"
		/>
		<view class="panel panel_access" catchtouchmove="{{ opened ? 'noop' : '' }}">
			<view class="panel__bd">
				<view
				 class="media-box media-box_appmsg"
				 hover-class="cell_active"
				 wx:for="{{ repos }}"
				 wx:key="index"
				>
					<view class="media-box__hd media-box__hd_in-appmsg">
						<image class="media-box__thumb" src="{{ item.owner.avatar_url }}" />
					</view>
					<view class="media-box__bd media-box__bd_in-appmsg">
						<view class="media-box__title">{{ item.name }}</view>
						<view class="media-box__desc">{{ item.description }}</view>
						<view class="media-box__info">
							<view class="media-box__info__meta">forks: {{ item.forks_count }}</view>
							<view class="media-box__info__meta">stars: {{ item.stargazers_count }}</view>
							<view class="media-box__info__meta">date: {{ item.date }}</view>
						</view>
					</view>
				</view>
			</view>
		</view>
	</view>
</view>
import './index.less';
import { FilterbarConfigItems, FilterBarOnChangeValue } from '@wines/filterbar';
const data: FilterbarConfigItems = [
  {
    type: 'radio',
    label: 'Updated',
    value: 'updated',
    checked: true,
    children: [
      {
        label: 'Recently updated',
        value: 'desc',
        checked: true, // 默认选中
      },
      {
        label: 'Least recently updated',
        value: 'asc',
      },
    ],
    groups: ['001'],
  },
  {
    type: 'text',
    label: 'Forks',
    value: 'forks',
    groups: ['002'],
  },
  {
    type: 'sort',
    label: 'Stars',
    value: 'stars',
    groups: ['003'],
  },
  {
    type: 'filter',
    label: '筛选',
    value: 'filter',
    checked: true,
    children: [
      {
        type: 'radio',
        label: 'Languages(单选)',
        value: 'language',
        children: [
          {
            label: 'JavaScript',
            value: 'javascript',
          },
          {
            label: 'HTML',
            value: 'html',
          },
          {
            label: 'CSS',
            value: 'css',
          },
          {
            label: 'TypeScript',
            value: 'typescript',
          },
        ],
      },
      {
        type: 'checkbox',
        label: 'Query(复选)',
        value: 'query',
        children: [
          {
            label: 'Angular',
            value: 'angular',
          },
          {
            label: 'Vue',
            value: 'vue',
          },
          {
            label: 'React',
            value: 'react',
            checked: true, // 默认选中
          },
          {
            label: 'Avalon',
            value: 'avalon',
          },
        ],
      },
      {
        type: 'checkbox',
        label: '配送方式',
        value: 'away',
        children: [
          {
            label: '京东配送',
            value: '1',
          },
          {
            label: '货到付款',
            value: '2',
          },
          {
            label: '仅看有货',
            value: '3',
          },
          {
            label: '促销',
            value: '4',
          },
          {
            label: '全球购',
            value: '5',
          },
          {
            label: 'PLUS专享价',
            value: '6',
          },
          {
            label: '新品',
            value: '7',
          },
          {
            label: '配送全球',
            value: '8',
          },
        ],
      },
      {
        type: 'radio',
        label: '性别',
        value: 'gander',
        children: [
          {
            label: '男',
            value: '0',
          },
          {
            label: '女',
            value: '1',
          },
          {
            label: '通用',
            value: '2',
          },
        ],
      },
      {
        type: 'checkbox',
        label: '闭合方式',
        value: 'closed_mode',
        children: [
          {
            label: '卡扣',
            value: '0',
          },
          {
            label: '拉链',
            value: '1',
          },
          {
            label: '其他',
            value: '2',
          },
        ],
      },
      {
        type: 'checkbox',
        label: '轮子种类',
        value: 'wheel_type',
        children: [
          {
            label: '万向轮',
            value: '0',
          },
          {
            label: '单向轮',
            value: '1',
          },
          {
            label: '飞机轮',
            value: '2',
          },
          {
            label: '其他',
            value: '3',
          },
        ],
      },
      {
        type: 'checkbox',
        label: '箱包硬度',
        value: 'wheel_type',
        children: [
          {
            label: '硬箱',
            value: '0',
          },
          {
            label: '软硬结合',
            value: '1',
          },
          {
            label: '软箱',
            value: '2',
          },
          {
            label: '其他',
            value: '3',
          },
        ],
      },
      {
        type: 'checkbox',
        label: '适用场景',
        value: 'wheel_type',
        children: [
          {
            label: '旅行',
            value: '0',
          },
          {
            label: '婚庆',
            value: '1',
          },
          {
            label: '出差',
            value: '2',
          },
          {
            label: '其他',
            value: '3',
          },
        ],
      },
    ],
    groups: ['001', '002', '003'],
  },
];
Page({
  data: {
    items: data,
  },
  onLoad() {
    this.getRepos();
  },
  onChange(e) {
    const { checkedItems, items, checkedValues } = e.detail as FilterBarOnChangeValue;
    const params: Record<string, unknown> = {};
    console.log(checkedItems, items, checkedValues);
    checkedItems.forEach((n) => {
      if (n.checked) {
        if (n.value === 'updated') {
          const selected = (n.children || [])
            .filter((n) => n.checked as boolean)
            .map((n) => n.value as string)
            .join(' ');
          params.sort = n.value;
          params.order = selected;
        } else if (n.value === 'stars') {
          params.sort = n.value;
          params.order = n.sort === 1 ? 'asc' : 'desc';
        } else if (n.value === 'forks') {
          params.sort = n.value;
        } else if (n.value === 'filter') {
          (n.children || [])
            .filter((n) => n.selected as string)
            .forEach((n) => {
              if (n.value === 'language') {
                const selected = (n.children || [])
                  .filter((n) => n.checked as boolean)
                  .map((n) => n.value as string)
                  .join(' ');
                params.language = selected;
              } else if (n.value === 'query') {
                const selected = (n.children || [])
                  .filter((n) => n.checked as boolean)
                  .map((n) => n.value as string)
                  .join(' ');
                params.query = selected;
              }
            });
        }
      }
    });

    console.log('params', params);
    this.getRepos(params);
  },
  getRepos(params: Record<string, unknown> = {}) {
    const language = (params.language || 'javascript') as string;
    const query = (params.query || 'react') as string;
    const q = `${query}+language:${language}`;
    const data = Object.assign(
      {
        q,
        order: 'desc',
      },
      params,
    );
    console.log(data);
    void wx.showLoading({ title: '加载中' });

    setTimeout(() => {
      const repos: unknown[] = [];
      for (let i = 0; i < 20; i++) {
        repos.push({
          owner: { avatar_url: 'https://cdn.skyvow.cn/logo.png' },
          name: 'wux-weapp',
          description: '一套组件化、可复用、易扩展的微信小程序 UI 组件库',
          forks_count: 4400,
          stargazers_count: 850,
          date: Date.now(),
        });
      }
      this.setData({ repos });
      void wx.hideLoading();
    }, 1500);
  },
  onOpen() {
    this.setData({ opened: true });
  },
  onClose() {
    this.setData({ opened: false });
  },
  /**
   * 阻止触摸移动
   */
  noop() {
    /** */
  },
});

API

FilterBar props

参数类型描述默认值
prefixClsstring自定义类名前缀wux-filterbar
itemsarray组件子元素[]
items[].typestring子元素类型,可选值为:radio、text、checkbox、sort、filter-
items[].labelstring描述-
items[].valuestring唯一值-
items[].childrenarray子元素[]
items[].groupsarray所属分组[]
menuBarHeightnumber考虑安全区域, type=filter的时候是否有原生HeaderMenuBar, 如果没有header Menubar 考虑设置为032
confirmTextstring确定按钮的文字确定
cancelTextstring取消按钮的文字重置
bind:changefunctionchange 事件触发的回调函数-
bind:scrollfunctionscroll 事件触发的回调函数-
bind:openfunction打开 select 或 filter 时触发的回调函数-
bind:closefunction关闭 select 或 filter 时触发的回调函数-

FilterBar externalClasses

名称描述
wux-class根节点样式类
1.5.1

1 year ago

1.5.0

1 year ago

1.3.5

2 years ago

1.4.0

2 years ago

1.3.4

3 years ago

1.3.2

3 years ago

1.3.1

3 years ago

1.3.0

3 years ago