npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

web-component-mobile

v1.0.11

Published

这个是基于Web Components、shadow DOM构建的一个高用户体验的UI组件!主要用于移动端!!!你可以用于html、Vue以及其他流行的框架中!

Readme

customElements

这个是基于 Web Components 、 shadow DOM 构建的一个高用户体验的UI组件!主要用于移动端!!!你可以用于html、 Vue 以及其他流行的框架中!

tips:

如果需要兼容的IE浏览器,可能有些吃力! 毫不意外,它天然的支持html!因为鄙人只会 vue 框架。就以 vue 来演示。如果你还会 react 或者 angular 等其他框架,你不妨大胆的在你的项目中来使用它!!!

$\color{#F56C6C}{题外话:另外推荐我自己基于vue封装的组件:}$ xing-ui-mobile xing-ui-mobile-v3 可以点击上方链接🔗即可跳转!

安装:

npm i web-component-mobile

使用:

对于消除使用vue未注册组件的警告教程🔗

在入口文件中引用:
  import globalComponent from 'web-component-mobile'
  globalComponent()
  
  对于全局js调用的组件,会挂载到 window._that 下。
  非全局js调用的组件,则根据自己的需求按需引入!

  tips:
    如果按需引入组件,则需要在项目入口文件中引入总包,否则无法使用!

toast组件

  语句:
    _that.showToast(content, ?delay);  //content:显示文本。delay:显示时长,默认2000ms


  使用场景1:
    fetch('http://xxxxxx.com/getxxxx')
      .then(res => res.json())
      .then(res => {
        _that.showToast(res.msg || 'success!')
      })
      
  使用场景2:
    <template>
      <img src="xxxxx.png" @click="inertClick"/>
    </template>

    <script setup>
      const inertClick = () => {
        _that.showToast('该图片不允许点击')
      }
    </script>

loading 组件

  语句:
    _that.showLoading() // 显示加载动画
    _that.hideLoading() // 隐藏加载动画

  使用方式:
    <button @click="Loading(true)">展示默认加载动画</button>
    <button @click="customLoading">展示自定义加载动画</button>
    <button @click="Loading(false)">隐藏加载动画/加载完成</button>   
    
    <script setup>
      const Loading = (bool) => {
        if (bool) {
          _that.showLoading() // 显示加载动画
        } else {
          _that.hideLoading() // 隐藏加载动画
        }
      }

      // 因为该组件不是通过匿名标签在模版中使用的。所以看上去可能定义自定义加载动画有点麻烦
      // 在全局 _that 中,暴露的有一个 loadingConfig 属性,将自定义的动画传入到该属性中
      // 该属性格式第一个标签必须是style,第二个必须是元素!

      const customLoading = () => {
        _that.loadingConfig = `
          <style>
            .animation-demo {
              border-radius: 4px;
              background-color: rgba(0, 0, 0, .7);
              height: 44px;
              width: 44px;
              display: grid;
              place-items: center;
              position: fixed;
              left: 50%;
              top: 50%;
              transform: translate(-50%, -50%);
              position: fixed;
              left: 50%;
              top: 50%;
              transform: translate(-50%, -50%);
            }
            .animation-demo > span {
              height: 19px;
              width: 19px;
              border: 1px solid #fff;
              border-top-color: transparent;
              border-radius: 19px;
              animation: rotate infinite forwards .5s linear;
            }
            
            @keyframes rotate {
              from {
                transform: rotate(0);
              }
              to {
                transform: rotate(360deg);
              }
            }
          </style>
          <div class="animation-demo">
            <span></span>
          </div>
        `
        Loading(true)
      }
    </script>

pullRefresh 下拉刷新组件

  使用方式:
  在需要的页面引入:
  import 'web-component-mobile/pullRefresh/xingPullRefresh'

  完整演示代码:
  <xing-pull-refresh ref="refreshDom">
    <div slot="content">
      <div>我是内容下拉展示刷新~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
      <div>我是内容~</div>
    </div>
  </xing-pull-refresh>

  <script setup>
    import 'web-component-mobile/pullRefresh/xingPullRefresh'
    import { nextTick, onMounted, ref } from 'vue';

    const refreshDom = ref()
    onMounted(() => {
      nextTick(() => {
        refreshDom.value.addEventListener('refreshEvent', (e) => {
          const { detail } = e
          if (detail.status) { //如果是打开状态,模拟请求3s关闭动画
            setTimeout(() => {
              detail.closeRefresh()
            }, 3000)
          }
        })
      })
    })
  </script>

  提示:
    // 因为我内部使用的customEvent自定义的事件,且绑定到了 xing-pull-refresh 这个 元素上。
    // 所以需要监听该元素上的 ‘refreshEvent’ 这个事件

  该事件参数:
    status: 状态,当前是打开还是关闭
    closeRefresh: 关闭动画方法。

  slot插槽:
    icon:动画区域,可传入自定义加载动画
    content:内容区域

swipeCell 滑动单元格组件

  使用方式:
  在需要的页面引入:
  import 'web-component-mobile/swipe/xingSwipeCell'

  完整演示代码:
  <template>
    <xing-swipe-cell>
      <div slot="content">插槽演示</div>
      <div slot="right" style="background-color: antiquewhite; height: 100%;">我是自定义内容</div>
    </xing-swipe-cell>
  </template>

  <script setup>
    import 'web-component-mobile/swipe/xingSwipeCell'
  </script>

  slot插槽:
    right:右侧自定义内容区域
    content:单元格主要内容区域

xingSwipe 轮播组件

  目前该组件暂不支持自动轮播功能!!!

  使用方式:
    在需要的页面引入:
  import 'web-component-mobile/swipe/xingSwipe'

  完整演示代码:
    <!-- show-points:显示指示点 -->
    <xing-swipe show-points>
      <div slot="content" v-for="(item, index) in arr" :key="index">
        <div>{{ item.name }}</div>
        <div v-html="item.other"></div>
        <img :src="item.path" />
      </div>
    </xing-swipe>

    <script setup>
      import { ref } from 'vue';
      import 'web-component-mobile/swipe/xingSwipe'

      const arr = ref([
        {
          name: '向左滑一滑试试~',
          path: '../../public/favicon.ico',
          other: '<span style="color: red;">哈哈</span>'
        },
        {
          name: '第二页',
          path: '../../public/favicon.ico',
          other: '<span style="color: blue;">wow~</span>'
        }
      ])
    </script>

    提示:
      slot:
      // 具名插槽需要是content,即:slot=“content” 。如果不是content,则无法映射对应的元素

      props:
      // show-points:如果指定该属性,则显示内置指示点。
      如果你感觉内置的指示点样式不美观,该组件也抛出了当前滑动到的选项下标,你可以根据自己需求来定制指示点。示例:
      <xing-swipe ref="xingSwipe">
        *****
      </xing-swipe>

      onMounted(() => {
        nextTick(() => {
          // 通过监听该组件swipeIndex事件得到detail中返回的index
          xingSwipe.value.addEventListener('swipeIndex', (e) => {
            const { oldIndex, newIndex } = e.detail
            console.log(
              `上一个指示点下标:${oldIndex}, 当前指示点下标:${newIndex}`
            );
          })
        })
      })

xingPicker 选择器组件

  使用方式:
    在需要的页面引入:
  import 'web-component-mobile/picker/xingPicker'

  完整演示代码:

  <template>
    <button @click="okEvent">获取当前选择值</button>
    <!-- tip:  value="2-3-1" 可以指定选中默认值。格式:value="index1,index2,index3"-->
    <!-- 你可以大胆的使用任何符号进行分割,如“2-3+1” “2*3¥1”-->
    <!-- 他显示的则是你对应展示列的下标对应的值! -->
    <xing-picker ref="xingPicker" value="2-3-1"></xing-picker>
  </template>

  <script setup>
    import { nextTick, onMounted, ref } from 'vue';
    import 'web-component-mobile/picker/xingPicker'

    const xingPicker = ref()
    onMounted(() => {
      nextTick(() => {
        const picker = xingPicker.value
        // 通过该组件下的 _dataList 方法传入数据
        picker._dataList(
          {
            //需要显示几列, 最大支持三列
            columns: 3,
            axis: {
              one: { // 映射第一个数据
                data: 'yearData', // 数据源
                prop: 'date' // 显示对应key数据
              },
              two: { // 映射第二个数据
                data: 'monthData',
                prop: 'date'
              },
              three: { // 映射第三个数据
                data: 'dayData',
                prop: 'date'
              }
            },
            // 数据,需要是数组格式,不支持多维数组
            yearData: [// 第一列
              {
                date: '2022年'
              },
              {
                date: '2023年'
              },
              {
                date: '2024年'
              }
            ],
            monthData: [ // 第二列
              {
                date: '01月'
              },
              {
                date: '02月'
              },
              {
                date: '03月'
              },
              {
                date: '04月'
              },
              {
                date: '05月'
              },
              {
                date: '06月'
              },
              {
                date: '07月'
              }
            ],
            dayData: [ // 第三列
              {
                date: '01日'
              },
              {
                date: '02日'
              },
              {
                date: '03日'
              }
            ],
          }
        )
      })
    })

    // 为了保证性能,需要自己调用改组件下的 _getPickerValue 方法获取选中的值
    const okEvent = () => {
      const res = xingPicker.value._getPickerValue()
      console.log(res);
    }
  </script>