Giter VIP home page Giter VIP logo

taro-listview's Introduction

📦🚀taro-listview

semantic-release npm latest version GitHub Actions status

  • 列表内部懒模块-解决小程序图片过多内存问题
  • skeleton 拓展状态屏
  • virtual-list(WIP)【虚拟列表】
  • 支持TaroV3 、NPM版本2.x.x

维护平台

微信小程序h5

文档

Documents

安装方式

安装:npm i taro-listviewyarn add taro-listview

使用案例

引入组件

列表 Demo

!!!需给组件设置固定高度

API

ListView

可配置参数

页面状态控制参数

属性 说明 类型 默认值 必传
style - - - -
lazy 开启懒加载(传入字符串为父元素 className 且开启) boolean or string false or '.lazy-view' -
hasMore 加载更多 boolean true true
isEmpty 展示空凭页 boolean - -
isError 展示错误页 boolean - -
needInit 初始化&自动调用下拉刷新方法 boolean - -
distanceToRefresh 下拉刷新距离 number - -
damping 最大下拉距离 number - -
autoHeight 开启自适应高度 boolean - -
lazyStorage Storage Key值用于区分ListView string box -

自定义页面 UI(状态提示语,空白屏、错误屏、底部状态的 UI 自定义)

属性 说明 类型 默认值 必传
color 下拉加载时 loading 的颜色 string #667baf -
emptyText 空白页提示语 string - -
footerLoadedText 列表底部加载完毕提示语 string -
footerLoadingText 列表底部加载中提示语 string 加载中 -
launch *是否开启状态屏的渲染,状态屏节点对应以下 renderXX 属性(如下) object { launchError = false, launchEmpty = false, launchFooterLoaded = false, launchFooterLoading = false } -
renderError 错误页 Taro.Node - -
renderEmpty 空白页 Taro.Node - -
renderFooterLoaded 自定义底部加载完毕 Taro.Node - -
renderFooterLoading 自定义底部加载 Taro.Node - -
indicator 下拉提示语 Object { release = '加载中', activate = '下拉刷新', deactivate = '释放刷新'} -

*错误屏中重新初始化方法与下拉刷新方法一致

import Taro, { Component } from "@tarojs/taro";
import { View, Image } from "@tarojs/components";
import ListView, { LazyBlock } from "taro-listview";

const blankList = [
  {
    author: {},
    title: "this is a example"
  },
  {
    author: {},
    title: "this is a example"
  },
  {
    author: {},
    title: "this is a example"
  },
  {
    author: {},
    title: "this is a example"
  }
];

let pageIndex = 1;

export default class Index extends Component {
  state = {
    isLoaded: false,
    error: false,
    hasMore: true,
    isEmpty: false,
    list: blankList
  };

  getData = async (pIndex = pageIndex) => {
    if (pIndex === 1) this.setState({ isLoaded: false });
    const {
      data: { data }
    } = await Taro.request({
      url: "https://cnodejs.org/api/v1/topics",
      data: {
        limit: 10,
        page: pIndex
      }
    });
    console.log({ data });
    return { list: data, hasMore: true, isLoaded: pIndex === 1 };
  };

  componentDidMount() {
    this.refList.fetchInit();
  }

  pullDownRefresh = async () => {
    pageIndex = 1;
    const res = await this.getData(1);
    this.setState(res);
  };

  onScrollToLower = async fn => {
    const { list } = this.state;
    const { list: newList, hasMore } = await this.getData(++pageIndex);
    this.setState({
      list: list.concat(newList),
      hasMore
    });
    fn();
  };

  refList = {};

  insRef = node => {
    this.refList = node;
  };

  render() {
    const { isLoaded, error, hasMore, isEmpty, list } = this.state;
    return (
      <View className="skeleton lazy-view">
        <ListView
          lazy
          ref={node => this.insRef(node)}
          isLoaded={isLoaded}
          isError={error}
          hasMore={hasMore}
          style={{ height: "100vh" }}
          isEmpty={isEmpty}
          onPullDownRefresh={this.pullDownRefresh}
          onScrollToLower={this.onScrollToLower}
          lazyStorage='lazyView'
        >
          {list.map((item, index) => {
            return (
              <View className="item skeleton-bg" key={index}>
                <LazyBlock current={index} className="avatar" lazyStorage='lazyView'>
                  <Image
                    className="avatar skeleton-radius"
                    src={item.author.avatar_url}
                  />
                </LazyBlock>
                <View className="title skeleton-rect">{item.title}</View>
              </View>
            );
          })}
        </ListView>
      </View>
    );
  }
}

模块懒加载

1.模块需固定同一高度。

2.只能在 ListView 组件内使用,并开启 lazy 模式,且父元素的 className='lazy-view'!!!

3.组件需传入模块遍历后的下标。

API

LazyBlock
属性 说明 类型 默认值 必传
current 传入模块遍历后的下标 number null true
lazyStorage Storage Key值用于区分ListView(获取是哪一个ListView) string box -
import Taro, { Component } from "@tarojs/taro";
import { View, Image } from "@tarojs/components";
import ListView, { LazyBlock } from "taro-listView";

let pageIndex = 1;

export default class Index extends Component {
  state = {
    isLoaded: false,
    error: false,
    hasMore: true,
    isEmpty: false,
    list: []
  };

  getData = async (pIndex = pageIndex) => {
    if (pIndex === 1) this.setState({ isLoaded: false });
    const {
      data: { data }
    } = await Taro.request({
      url: "https://cnodejs.org/api/v1/topics",
      data: {
        limit: 10,
        page: pIndex
      }
    });
    return { list: data, hasMore: true, isLoaded: pIndex === 1 };
  };

  componentDidMount() {
    this.getData();
  }

  onScrollToLower = async fn => {
    const { list } = this.state;
    const { list: newList, hasMore } = await this.getData(++pageIndex);
    this.setState({
      list: list.concat(newList),
      hasMore
    });
    fn();
  };

  render() {
    const { isLoaded, error, hasMore, isEmpty, list } = this.state;
    return (
      <View className="lazy-view">
        <ListView
          lazy
          isLoaded={isLoaded}
          hasMore={hasMore}
          style={{ height: "100vh" }}
          onScrollToLower={this.onScrollToLower}
          lazyStorage='lazyViewBlock'
        >
          {list.map((item, index) => {
            return (
              <View className='item' key={index}>
                <LazyBlock current={index} className='avatar' lazyStorage='lazyViewBlock'>
                  <Image className='avatar' src={item.author.avatar_url} />
                </LazyBlock>
                <View className="title">{item.title}</View>
              </View>
            );
          })}
        </ListView>
      </View>
    );
  }
}

骨架屏

1.因骨架屏是捕捉已有占位数据的样式,再绘制出骨架,所以要先注入默认空白占位数据。

2.且需要一个传入父元素的 className(默认获取为“skeleton”),以便寻找元素下的所有“关节”元素。可通过传入 selector 参数自定义 className。

有且只有捕捉以下提供的“关节”样式名:背景('skeleton-bg')、矩阵('skeleton-rect')、圆形('skeleton-redius')。

3.ListView 组件已嵌套 Skeleton 组件,直接调用对应属性即可。

*“关节”元素需内容撑开,或者固定高度。

API

Skeleton
属性 说明 类型 默认值 必传
isLoaded 骨架屏是否显示(eg:加载第一页时开启) boolean false -
selector 骨架屏外层 class 名称 skeleton - -

骨架屏 Demo

import Taro, { useState } from "@tarojs/taro";
import { View, Button } from "@tarojs/components";
import { Skeleton } from "components";
import "./index.scss";

export default () => {
  const [isLoaded, setLoaded] = useState(false);
  return (
    <View>
      <Button onClick={() => setLoaded(!isLoaded)}>toggle</Button>
      <View className="skeleton">
        <Skeleton isLoaded={isLoaded}>
          {Array(4)
            .fill(1)
            .map(i => (
              <View className="item skeleton-bg" key={i}>
                <View className="avatar skeleton-radius" />
                <View className="title skeleton-rect">title</View>
              </View>
            ))}
        </Skeleton>
      </View>
    </View>
  );
};

方法参数

事件名称 说明 类型 默认值 必传
onPullDownRefresh 下拉刷新触发函数 function - -
onScrollToLower 上拉底触发函数 function - -
onPullDownRefresh = () => {
  getData();
};

onScrollToLower = async fn => {
  await getData();
  fn();
};

taro-listview's People

Contributors

a0150315 avatar rahim-chan avatar semantic-release-bot avatar smi1e96 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

taro-listview's Issues

Super expression must either be null or a function

直接引用编译报错:
1589868492800

Taro CLI 3.0.0-beta.5 environment info:
System:
OS: macOS 10.14.6
Shell: 5.3 - /bin/zsh
Binaries:
Node: 11.10.1 - /usr/local/bin/node
Yarn: 1.22.4 - /usr/local/bin/yarn
npm: 6.9.0 - /usr/local/bin/npm
npmPackages:
@tarojs/components: 3.0.0-beta.5 => 3.0.0-beta.5
@tarojs/taro: 3.0.0-beta.5 => 3.0.0-beta.5
@tarojs/webpack-runner: 3.0.0-beta.5 => 3.0.0-beta.5
eslint-config-taro: 3.0.0-beta.5 => 3.0.0-beta.5
nervjs: ^1.5.6 => 1.5.6
react: ^16.13.1 => 16.13.1

骨架屏

image

是否可以给出一个完整的代码demo?并且将代码修复下错误

急需无限长列表

今天才知道微信小程序有页面节点限制(不得超过 1600 个)
而公司新项目首页重度依赖taro-listview用于展示商品列表,快上线了,很慌
希望能加快进度,增加虚拟滚动优化,如果快个人可提供少许报酬
请参考 recycle-view

onScrollToLower方法无法被触发

上拉加载代码无法被触发,代码如下
onScrollToLower = (fn) => {
console.log('到底了');
fn()
};
........
<ListView
hasMore={hasMore}
onScrollToLower={(fn) => {this.onScrollToLower(fn)}}
>
......

关于小程序模式下拉在安卓机上卡顿

这个问题我也注意到了。原因有可能以下几种
1.安卓机H5本身的系统问题
2.图片太多,质量太大(后续会拓展懒加载模块,主要针对图片数量太多,导致内存占用过多)
3.taro生成H5的布局Html层级太深
4.下拉列表的性能优化(我已经尽力了,taro官网的下拉H5也没做啥优化呀??搞不懂,可比较试试)

h5 语法报错

taro 版本 v2.2.9
taro-listview 版本 v1.4.2

使用插件示例编译成h5浏览器报错 , 如图.
微信截图_20200708163114
微信截图_20200708163128

发现了好几个bug

1.footerLoading属性没有用,我是这样用的,footerLoading="loading..."
2.怎么判断下拉到底部后,没有更多数据了呢?不可能一直下拉到空数据还可以一直下拉吧?你这个例子中没有看到要怎么解决

taro 3.0.2版本下 使用会报错

ncaught (in promise) TypeError: Super expression must either be null or a function
at _inherits (inherits.js?66c3:4)
at eval (index.js?2feb:5)
at eval (index.js?2feb:5)
at Module../node_modules/_taro-listview@1.4.3@taro-listview/dist/h5/components/skeleton/index.js (44.js:242)
at webpack_require (app.js:64)
at eval (index.js:15)
at Module../node_modules/_taro-listview@1.4.3@taro-listview/dist/h5/components/list-view/index.js (44.js:137)
at webpack_require (app.js:64)
at eval (index.js?5d25:1)
at Module../node_modules/_taro-listview@1.4.3@taro-listview/dist/h5/index.js (44.js:265)

页面元素在, 但是显示空白,isEmpty为false

image

class Home extends Component {
constructor(){
super(...arguments)
this.state = {
isLoaded: false,
error: false,
hasMore: true,
isEmpty: false,
}
}
componentWillMount () { }

componentDidMount () {
this.refList.fetchInit()
}

pullDownRefresh = async (rest) => {
console.log('rest: ', rest);
// pageIndex = 1;
// const res = await this.getData(1);
// this.setState(res);
rest()
};

onScrollToLower = async (fn) => {
console.log('onScrollToLower: ');

fn();

};
render () {
const { isLoaded, hasMore, error, isEmpty } = this.state;
return (

<ListView
lazy
ref={node => this.refList = node}
isLoaded={ isLoaded }
isError={error}
hasMore={hasMore}
style={{ height: '100vh' }}
isEmpty={isEmpty}
onPullDownRefresh={fn => this.pullDownRefresh(fn)}
onScrollToLower={this.onScrollToLower}
>
......此处省略业务代码

  </View>
)

}
}

2.0.2报错

2.0.2的taro是3.0.2的,一下升级了好多啊

上拉加载更多问题

上拉加载更多,第一次拉到底部触发onScrollToLower方法,再拉到底部不触发onScrollToLower方法。

依赖冲突问题

项目引用了@tarojs/cli,版本为1.3.15
这个依赖组件本身没有用到吧 ?
它的存在会导致和全局的cli冲突.

2.0.3版本在 npm 包中找不到

你好,我安装的时候在 npm版本历史 中找不到 2.0.3 版本,但在 Github 的发版历史中可以找到,请问是不是 git tag 完忘记 npm publish 了。
虽然可以通过yarn add https://github.com/Rahim-Chan/taro-listview.git 安装主分支最新的,就是安装完没有编译出dist目录,并且无法用 npm run build 自行编译,看错误是 package.json 中缺少 browser 配置。

image
image

建议block.tsx 中 设置缓存 lazyBox 改为参数

缓存变量 lazyBox 改为参数

当 开发版、体验版、正式版 都在运行时 都在使用这一个缓存 容易出现混乱:smile:

这样的话 微信可以使用 wx.getAccountInfoSync()来设置不同版本中 缓存

tips: 我也可以拉个pr 合并下:stuck_out_tongue_closed_eyes:

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.