react-native 骨架屏 rn-placeholder之使用以及封装使用案例

首先是package的介绍

http://npm.taobao.org/package/rn-placeholder 

 

接下来是封装代码(安装引用本文不提及)

import React from "react";
import Placeholder from "rn-placeholder";
import { StyleSheet, View } from "react-native";

const Title = hasTitle => {
  return hasTitle ? (
    <View style={styles.title}>
      <Placeholder.Line />
    </View>
  ) : null;
};
const Placeholders = props => {
  const { ParagraphLength, ParagraphType, hasTitle, ...others } = props;
  const PlaceholderItem = Placeholder[ParagraphType];
  const PlaceholderContent = [];
  for (let key = 0; key < ParagraphLength; key++) {
    PlaceholderContent.push(
      <View style={styles.item} key={`PlaceholderContentKey${key}`}>
        {Title(hasTitle)}
        <PlaceholderItem {...others} animate="fade" />
      </View>
    );
  }
  return <View>{PlaceholderContent}</View>;
};

const ImageContent = props => {
  const baseOption = {
    ParagraphLength: 5,
    ParagraphType: "ImageContent",
    hasTitle: false,
    size: 60,
    lineNumber: 3,
    lineSpacing: 12,
    lastLineWidth: "60%"
  };
  const options = { ...baseOption, ...props };
  const { isLoading, list } = props;

  if (isLoading) {
    return Placeholders(options);
  }
  return typeof list === "function" && list();
};

const Paragraph = props => {
  const baseOption = {
    lineNumber: 3,
    textSize: 16,
    lineSpacing: 5,
    width: "100%",
    lastLineWidth: "70%",
    firstLineWidth: "50%"
  };

  const options = { ...baseOption, ...props };
  const { isLoading, list } = props;

  if (isLoading) {
    return Placeholders(options);
  }
  return typeof list === "function" && list();
};

/* 导出
 ============================================================ */
const ImagePlaceholder = Placeholder.connect(ImageContent);
const ParagraphPlaceholder = Placeholder.connect(Paragraph);
export { ImagePlaceholder, ParagraphPlaceholder };

/* 样式
 ============================================================ */
const styles = StyleSheet.create({
  title: {
    marginBottom: 12
  },
  item: {
    margin: 12
  }
});

 

使用( 也支持段落ParagraphPlaceholder)

renderNews = () => {
    return (
      <View style={{ flex: 1 }}>
        <SectionItem title="最新消息" rightBtnText="更多" onPress={() => {}} />
        <ImagePlaceholder
          ParagraphLength={2}
          // isLoading={!this.alreadyLoad && loadStatus === LoadStatus.Loading}
          isLoading={false}
          list={this.renderTaskList}
        />
      </View>
    );
};

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzxOnlineOk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值