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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@yuan.gao4/grid

v1.0.7

Published

简易的表格控件,支持锁表头和锁左边的列

Downloads

2

Readme

DEMO:

import React from 'react';
import dom  from 'react-dom';
import Grid from '@en/grid';

var Me = React.createClass({
    getInitialState(){
        return {
            data:[],

            columns:
            [
                {title:'',key:'index',style:{width:100}},
                {title:'场站名称',key:'name'},
                {title:'titleA',key:'key1'},
                {title:'titleB',key:'key2',style:{textAlign:'right',width:100,backgroundColor:'grey'}},
                {title:'titleC',key:'key3'},
                {title:'titleD',key:'key4',fmt:(data,row)=><a href={'http://xxx.com/'+row.name} target='_blank' style={{color:'red'}}>data</a>}
            ]
        }
    },

    //pageSize为分页大小,目前由控件内部ui指定,由用户选择。如果pager为false,则不开启分页,pageSize将=0
    //page为当前分页,从0开始
    //sortColumn为当前排序的列,如果没有任何列被排序,则为空
    //sortDir为排序方向,0为未排序,1为asc,2为des
    onData(pageSize,page,sortColumn,sortDir){
        console.log(pageSize,page,sortColumn,sortDir)

        //在这里发请求,获取数据
        //grid初始化的时候会先调用一次,因此可以把ajax请求直接写在这里简化程序,无需另外初始化
        //后端需要完成排序和分页,这里没有做,因此界面上是看不出排序效果的
        //ajax('xxxx',{pageSize,page,sortColumn,sortDir},'POST')
        //.then(data=>this.setState({data:data}))

        //demo没有后端,前端简单模拟一下
        var data = [
            {name:'场站1',key1:1,key2:2,key3:3,key4:1},
            {name:'场站2',key1:1,key2:2,key3:3,key4:3},
            {name:'场站3',key1:1,key2:2,key3:3,key4:4},
        ];

        //增加index字段,这里展示一下如何自定义index字段
        data.forEach((o,i)=>Object.assign(o,{index:i+page*pageSize+1}))

        this.setState({data:data})
    },

    //单行选中操作
    onSelect(row){
        alert(`你点了"${row.name}"`);
    },

    //react渲染
    render(){
        return <Grid
            style={{}}

            cellStyle={{}}
            alterStyle={{}}
            titleStyle={{}}                

            frozenColumn={1}
            frozenAfter={1}
            frozenStyle={{}}
            sortStyle={{}}

            columns= {this.state.columns}
            language={'zh'}
            data={this.state.data}
            pager={true}
            onChange={this.onSelect}
            onData={this.onData}
            count={3000}
        />;
    }

    
})

dom.render(<Me />, document.getElementById('container'));

说明:

  • demo较丑请忽略,body加上蓝绿色的背景色就正常了

  • style和className属性将直接作用在生成的容器div上,也就是外框。注意,整体的font-size在这里设置

  • cellStyle 将作用于每一个cell之上,优先级最低,会被所有其他style覆盖

  • alterStyle 将作用于隔行的cell之上

  • titleStyle 将作用于标题栏的每个cell上

  • hoverStyle 将作用于当前鼠标hover的行上

  • sortStyle 将作用于当前被排序的列的title格上

  • frozenStyle 将作用于被冻结的列上

  • frozenColumn为锁定列的数量,默认为0。如果为n,则锁定最左面的n列,不会受scroll影响,也无法被拖动。

  • frozenAfter为尾部锁定列的数量,默认为0。如果为n,则锁定最右面的n列,不会受scroll影响,也无法被拖动。

  • columns 为每个列的描述, 主要属性为 title, style,和 fmt

    • key 为列的唯一id,在data的行中,作为提取内容的key。如果没有提供,则按照数组位置提取。
    • title为字符串,也可以是jsx对象,用于显示于标题栏内
    • style为列的css描述,不可以设置高度(显然不能在一行里面单独设置某一列的高度),其他css属性都将作用于整个列上的每一个cell,包括标题和数据区域,优先级很高,覆盖上面的多数属性。不可设置left,top等位置属性。
    • fmt为格式化函数,非常重要,自定义表格内容全靠他。data内的数据尽可能使用数字,当它们被渲染的时候则需要格式化,比如加上千分位,单位等。有时候可以直接返回一个dom按钮,上面绑定click操作进行行内操作。函数参数为 (cell,row),cell为当前渲染格的数据,row为当前行的数据。使用方式参考上面demo。
  • data为表格数据,为一系列数据对象的数组,格式参考demo。其实就是一组键值对。也支持二维数组形式。

  • pager为bool类型,指定是否要显示分页器

  • onChange为回调函数,当用户点击一行时被调用,唯一参数即被点击行当数据。

  • onData为加载数据回调,当组件加载,排序或者分页时,都会调用,以获取新的数据。函数参数参考上面demo

  • count为数据总条数,将被用于显示在翻页器内左下角,以及计算应该分几页

  • onResizeColumn为回调函数,当某一列被用户调整宽度之后,即会调用,形参:onResizeColumn(key,newWidth)

  • Grid支持列拖拽,列resize。

  • language为国际化参数,可选'en','zh'

Q & A

Q:我如何指定某一列的颜色? A:Columns属性内的对应object里,可以设置style属性,style都将被应用到这一列的每个格子上,这里只需设置backgroundColor即可:columns[3].style.backgroundColor = 'red';

Q:我如何锁定第一列,比如场站名称,不被滚动? A:frozenColumn={1}

Q:我如何锁定最后一列,比如“查看”“删除”“修改”按钮,不被滚动? A:frozenAfter={1}

Q:我如何锁定中间某列,不被滚动? A:别闹

Q:我不想自己做排序,也不想后台排序 A:不提供onData属性即可,控件本身支持内部排序

Q:有些列我不需要它排序 A:columns[3].sortable=false