Giter Site home page Giter Site logo

wxp-ui / wxp-ui Goto Github PK

View Code? Open in Web Editor NEW
870.0 15.0 242.0 2.12 MB

小程序插件合集(下拉刷新, 拖拽排序, 索引列表, 日期选择, 侧滑删除...)

License: MIT License

JavaScript 71.94% SCSS 28.06%
swipe-list wxp-ui drag drag-sort scroll tab date-picker index-list side-slip

wxp-ui's Introduction

WxP UI

WxP UI 是一款提供高交互小程序插件的合集, 致力于简洁和高可用性的插件实现.

说明

使用前请认真阅读文档和示例项目

该小程序所有组件都是基于微信小程序原生api编写的, 旨在提供最简明扼要的实现思路, 所以如果用了第三方框架会增加学习成本. 当然这也造成所有组件只有微信端实现的问题, 不过聪明的你看了这些实现后肯定可以举一反三, 实现其他端的展现.

线上演示

WxP

微信交流群

+微信 singletouch233 进群交流, 加的时候请备注: WxP UI. 您的 star 是我前进的动力~~.

Visual Studio Code

Scss 转 Wxss

Live Sass Compiler 插件

本项目默认包含.vscode 配置文件, 安装完插件即可使用

WebStorm

代码提示

  1. Preferences -> Plugins -> 搜索 Wechat mini program support 插件
  2. Preferences -> Languages & Frameworks -> JavaScript -> Libraries -> 启用wechat-mini-program-api

Scss 转 Wxss

使用npm全局安装sass工具

npm install sass -g

Preferences -> Tools -> File Watchers -> + scss 文件 ->

scss1

将上图参数替换

  • Arguments 参数替换为 --update --no-source-map $FileName$:$FileNameWithoutExtension$.wxss
  • Output paths to refresh 参数替换为 $FileNameWithoutExtension$.wxss

接着配置 ScopeFile Watcher 在项目中作用域, 我们点击最外层文件夹然后选择 Include Recursively 即递归整个项目文件

scss2

完成之后 Apply 即可

组件列表

  • swipe-list组件
  • scroll组件
  • tab组件
  • drag组件
  • x-drag组件
  • date-picker组件
  • side-slip组件(基于movable-view实现)
  • index-list组件

如何使用

git clone https://github.com/singletouch/wx-plugin.git

将需要使用的组件代码拷至自己的小程序项目中,按照小程序官方引入组件方式引入即可

本项目自身就是一个完整的小程序项目,也可以直接使用本项目作为小程序开发目录

组件配置

Scroll 组件

Scroll Attributes

参数 说明 类型 可选值 默认值
requesting 列表数据是否处于加载中 Boolean -- false
end 列表数据加载完成 Boolean -- false
emptyShow 控制空状态显示 Boolean -- false
listCount 当前列表长度 Number -- 0
emptyUrl 空列表的展示图片 String * /assets/image/empty/empty.png
emptyText 空列表的文字提示 String * 未找到数据
refreshSize 下拉刷新的高度 Number -- 90
topSize 顶部高度 Number -- 0
bottomSize 底部高度 Number -- 0
color 颜色 String -- ""
enableBackToTop 双击顶部状态栏回到顶部 Boolean -- false

Scroll Events

事件名称 说明 回调参数
refresh 下拉刷新 --
more 上拉加载 --

Scroll Slots

name 说明
-- 列表组件主体

Tab 组件

Tab Attributes

参数 说明 类型 可选值 默认值
tabData 数据源 Array -- []
tabCur 当前聚焦项索引 Number -- 0
scroll 是否可以超出滚动 Boolean -- false
size tab高度 Number -- 90
color 颜色 String -- ""

Tab Events

事件名称 说明 回调参数
change tab切换事件 当前选中tab的index

Tab Methods

方法名 说明 回调参数
scrollByIndex 让tab组件根据传入的index进行滚动 需要切换tab项的index

DatePicker 组件

后续更新

SideSlip 组件

SideSlip Methods

方法名 说明 回调参数
delete 点击删除按钮触发的事件 --

IndexList 组件

IndexList Attributes

参数 说明 类型 可选值 默认值
listData 数据源 Array -- []
topSize 顶部固定区域高度 Number -- 0(rpx)
bottomSize 底部固定区域高度 Number -- 0(rpx)
color 颜色 String -- ""
emptyUrl 空列表的展示图片 String * /assets/image/empty/empty.png
emptyText 空列表的文字提示 String * 未找到数据
emptyShow 控制空状态显示 Boolean -- false

listData Attributes

参数 说明 类型 可选值 默认值
key 索引值 String -- --
data 索引值对应数据 Array ... ...

数据结构演示, 如需更多数据结构和渲染样式, 需自行修改渲染和初始化部分代码.

[
    {
        key: "A",
        data: [
            {   
                name: "城市1", 
                code: "0001", 
                short: "city1"
            },
            {   
                name: "城市2", 
                code: "0002", 
                short: "city2"
            },
            ...
        ]
    },
    {
        key: "B",
        data: [
            {   
                name: "城市1", 
                code: "0001", 
                short: "city1"
            },
            {   
                name: "城市2", 
                code: "0002", 
                short: "city2"
            },
            ...
        ]
    },
    {
        key: "C",
        data: [
            {   
                name: "城市1", 
                code: "0001", 
                short: "city1"
            },
            {   
                name: "城市2", 
                code: "0002", 
                short: "city2"
            },
            ...
        ]
    }
    ...
]

IndexList Events

事件名称 说明 回调参数
click 点击item 当前item的数据信息

Drag 组件

tip: 最新版本去除 dataChange 方法, 改为直接使用 this.drag.init(), listData, columns, topSize, bottomSize 等参数变化时候需要手动初始化

Drag Attributes

参数 说明 类型 可选值 默认值
extraNodes 额外节点 Array -- []
listData 数据源 Array -- []
columns 列数 Number -- 1
topSize 顶部固定区域高度 Number -- 0(rpx)
bottomSize 底部固定区域高度 Number -- 0(rpx)
itemHeight 每个 item 高度(用于计算 item-wrap 高度) Number -- 0(rpx)
scrollTop 页面滚动高度(用于页面滚动时候正确计算) Number -- 0(rpx)

Drag Events

事件名称 说明 回调参数
change 排序监听事件 排序后数据
sortend 排序结束事件 排序后数据
click 点击item监听 item数据和排序key值

listData Attributes

参数 说明 类型 可选值 默认值
dragId 每个数据项唯一标识(必填, 提升渲染性能) String/Int -- --
fixed 是否固定该项 Boolean -- --
... ... ... ... ...

extraNodes Attributes

参数 说明 类型 可选值 默认值
type 额外节点类型 String/Int before/after/destBefore/destAfter --
dragId 每个数据项唯一标识(必填, 提升渲染性能) String/Int -- --
destKey 要插入的位置 Number -- --
fixed 额外节点是否固定 Boolean -- --
slot 额外节点展示的所使用的 slot 名称 String -- --

贡献

如果有什么好的建议欢迎提issues

License

MIT

wxp-ui's People

Contributors

iplusx avatar singletouch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wxp-ui's Issues

【Bug】swiper 数据串了

环境:MacOS 开发者工具最新版;安卓一加5T;iPhone8 Plus

复现:

  1. 假设此时有3个 swipe-item,分别是 s1, s2, s3,且都已经有了各自的 listData
  2. 当前处于 s2
  3. 下拉刷新请求 s2 的 listData,发送请求后立即切到 s1
  4. 此时进入到了 s1,如果刚才请求的 s2.listData 数据才返回过来,则 s1.pageData 会被 s2 的覆盖
  5. 此时 s1 和 s2 的数据会是一样的,在 s1 下拉刷新也无济于事,pageData已经被 s2 的覆盖了

drag组件使用,请问extraNodes 是不是可以去掉的?

1.因为正常的情况下 接口返回的数据会告诉你那些数据不可以移动的。(这些是可以根后端商量的)
我看代码中init()方法中 好像就是为了构造一个方便使用的数据结构(list)
2.还有容器的宽高相关计算也可以去掉的。原因是我看到这种计算 我总是会觉得要有什么小细节的适配动作。貌似也没有太大作用呢?
3.如果是跨区域拖拽有没有什么好的思路,谢谢~~

scroll组件的overOnePage

当页面中存在条件筛选去下拉刷新的时候 我遇到这样的问题
比如是综合排序 获取到了数据,然后我上滑加载更多后 overOnePage为true
这个时候我把条件改变 综合排序变成 距离远近的话 数据清空后 但是overOnePage为true 一直会显示加载中
image
image

demo里空列表会不断刷新

image

我是这么改的,先绕过了这个问题。不过这样调用 onLoad() 来刷新整个列表就不起作用了

应该有更好的改法?

大佬你好,我提个建议,也是我目前急需的功能。

可否将 drag 组件拆分成 drag 和 drag-item 两个部分。
然后使用

<drag id="drag"
    bind:click="dragItemClick"
    bind:change="dragOnChange"
    bind:sortend="dragSortEnd"
    bind:scroll="dragOnScroll"
    list-data="{{specList}}"
    columns="{{columns}}"
    scroll-top="{{scrollTop}}">

    <drag-item
        wx:for="{{specList}}"
        data-item="{{item}}"
        data-index="{{index}}">
        <view>
            Content...
        </view>
    </drag-item>
</drag>

这样的结构来书写列表项,不是在组件内部遍历,而是在页面中遍历。这样可以在页面中写列表项的样式,而且组件变得复用性更高了。

本来是打算在大佬的组件基础上增加 slot-scope 的,结果发现微信官方没有支持 slot-scope

所以只好自己尝试着拆代码写成两个关联组件了。

可是我能力有限,很难做到尽善尽美,不知道作者是否有空,可以实现一下这个功能?拜谢~

上拉加载有时不触发

  • 环境
    MacOS 10.14.5 官方微信开发者工具v1.02.1907300
  • 问题
    上拉加载有时候没有效果,没反应(已经把end写死为false使其能够无限加载)
  • 复现
    没有找到复现的规律,反复上拉几次(最好缓慢地上拉),肯定会出现的
  • 延伸
    谷歌搜索「scroll-view bindscrolltolower 触发」发现有很多类似的情况,很多都在说原因是scroll-view没有给出指定高度,导致小程序不确定是否到达底端

请问您知道具体原因并且能够修复吗,谢谢。

问题

那个拖拽排序的组件,预览时候没问题,真机调试时候会很卡顿

drag如果默认列表就是空,plus按钮不显示

老哥.

我数据完全是用户自主添加的那种.
无论有没有数据,底部都得要一个添加按钮.

可是,我发现如果默认列表是空,
var listData = wx.getStorageSync('listData ') || [];
plus 的destKey 设置多少都不好使.不显示

如果
用一个空元素
var listData = wx.getStorageSync('listData ') || [{}];

plus 的destKey设置0可以虽然显示.

不过会多一个空白项.

请问这是我应该如何操作?

一个页面两处使用时出现BUG

我在一个页面中两处使用了 drag-wxs 组件,第二个组件的定位出现问题,当我长按拖动第二个组件内的项时,项会偏离鼠标位置,移动到鼠标的下方。

拖拽排序列表

你好,请问拖拽排序,当列表超过一屏的高度时候,不能滑动,请问这个要怎么解决呢

scroll 组件使用问题

demo中,列表内容会包含在下拉刷新和上拉加载盒子的中间
image
而我在使用中,内容列表却在movable标签的外面,我面临的问题是,内容列表顶部会跟随刷新结束后被标题栏遮挡一部分
image
请问解决的思路是什么

movable-area与swpier手势冲突,导致下拉刷新会出现闪烁

当下拉刷新的时候,在“刷新成功”提示消失的瞬间,按住scroll-view不释放,scroll-view就会出现闪烁现象。
查了下抖动是因为movable-area的change事件返回的y坐标数值出现波动,而波动的时候swiper的catchmove能捕捉到事件(因为不想让swiper进行滚动),基本确定movable-area与swpier存在手势冲突。
请问有好的解决方法吗?

index-list的索引点击不够精确

老哥,你的组件写的很好,
1.我发现index-list的索引点击不够准确,你可试试用小程序的scroll-into-view试试精准定位
2.index-list里面可以加个slot,方便扩展
这些我自己的项目里面实现了,自己太low,就不贴代码了,你也可以试试这些优化一下

别的组件都看懂了,但swipe-list是啥

组件目录里没有单独的swipe-list,page里倒是有,但是是你写好的例子,而不是单独组件
请问这个是单独组件吗?readme里完全没有写swipe-list的使用方法啊
麻烦问下这个怎么用?不会是用tab和scroll拼出来吧

拖拽组件 超过屏幕 bind/catch冒泡事件 不使用 overOnePage和滑动条的一些想法

首先感谢提供的组件
overOnePage 猜测是为了无法在超过单屏幕后,组件无法自身滑动而设置的,原因是bind/catch冒泡事件阻拦。
起初,我将 bind:longpress catch:touchmove catch:touchend事件绑定在 info下的一个指示拖拽的图标上,这样,冒泡事件只在一个很小的区域被阻拦,很多区域可以滑动。

但是在某些图片上加入拖拽图示有显得不那么优雅。
琢磨一下,建议将

catch:touchmove="touchMove" 
catch:touchend="touchEnd"

改成

 catch:touchmove="{{dragging?'touchMove':''}}"
 catch:touchend="{{dragging?'touchMove':''}}"

完美解决本身滑动的问题,
在没有开始排序拖拽时,没有阻拦事件,
拖拽时,页面滑动有wx.pageScrollTo滑动拉出。

scroll组件上拉加载更多的交互是否可以优化?

开发者工具、安卓、iOS真机、基础库版本2.7.2,均发现有这个问题。

现象:
上拉的时候,如果就差一点点触底,而文案“加载中”可能已经完全展示出来了,此时会对用户造等待困惑,用户不知道实际上是没在加载的。只能继续上拉一点触发触底事件才行。
慢慢上拉还是经常会发生的,用力上拉的时候看运气~

建议:
交互方面,可不可以和「下拉刷新」一致。一开始展示的文案是“上拉加载”,之后类似,有点镜像的意思。

scroll 组件用防抖同步 scroll-top 属性有什么特殊用途嘛

我在使用过程中发现受限于 scroll 事件的触发密度,在高速滚动下容易出现回滚的情况(时间大概是一次滚动的末尾,幅度大概10个 px),原因应该是 scroll 事件最后一次触发时 给的高度 与最终停下来不相等,然后100ms 后触发更新 scroll-top 的函数,接着造成回滚。

我这里直接把整块同步 scroll-top 的部分给删除了,基本没有这种情况了。

看了下变量使用,应该不会造成什么影响。

所以想问问这东西假设没有什么特殊用途的话,是不是可以考虑删除掉,因为对于性能和体验影响都蛮大的

拖拽排序组件

拖拽的列表项监听touchMove用的是catch,为什么你的列表还能滑动,我是指列表本身的滑动,不是拖拽到底部向下滑动一个元素的距离

【需求】tab可以支持预设索引吗?

问题描述:
目前的tab好像不支持预设索引呢,我在tab指定「tabCur」和swipe-list指定「categoryCur」,初始化tab的activated项始终是第一个,其他数据如listData都是正确的。

目标:
可以指定tab的初始化项索引,如果超出tab的数组长度,则为首项0。

希望老兄有时间看下这个需求哈,十分感谢~

使用drag组件,在listData添加数据后重新调用drag.init()方法后图片不显示

listData添加数据后再调用drag.init()方法后有几率会出现新添加的数据不显示的问题
代码如下:
const newBannerList = this.data.listData

    console.log('result')
    console.log(result)

    newBannerList.push({
        images: result[0],
        fixed: false
    })

    // 延迟一点进行组件初始化(官方组件示例是这么使用的)
    setTimeout(() => {
        this.setData({
            listData: newBannerList
        })
        this.drag.init();
    }, 300)

关于拖拽功能

大神 ,我这边想搞一个上传拖拽 ,有一个上传按钮 上传按钮想跟这拖拽的图后面 要怎破呢

scroll组件下拉加载时重复请求

在scroll中,在下拉加载更多时,出现“加载中...”时,试着向上拉动,会重复发起more事件,也就是重复请求了。

可以试着在在getList事件中将setTimeout中值设置delay设置大些。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.