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

vj-tree

v0.0.8

Published

基于rc-tree的简单二次封装

Downloads

4

Readme

vj-tree

rc-tree和react-custom-scrollbars的简单二次封装

安装

$ npm i vj-tree -S

API

scrollWrap props(外层的滚动包裹)

| name | description | type | default | since | |------------|-------------|----------|-------------|-------| |scrollClass | react-custom-scrollbars的class | String | '' | 0.0.5 | |scrollStyle | react-custom-scrollbars的style | String | '' | 0.0.5 | |autoHeight | react-custom-scrollbars是否为高度自适应 | bool | false | 0.0.5 | |autoHeightMin | 当autoHeight为true时生效 | number | 0 | 0.0.5 | |autoHeightMax | 同上 | number | 120 | 0.0.5 |

Tree props(树相关)

| name | description | type | default | since | |------------|-------------|----------|-------------|-------| |treeClass | rc-tree的class | String | '' | 0.0.5 | |treeData | 树的数据源 | array | [] | 0.0.5 | |showIcon | 是否显示前面的图标 | bool | false | 0.0.5 | |multiple | 是否可以被多选(select) | bool | false | 0.0.5 | |selectable | 是否可以被select(click) | bool | true | 0.0.5 | |checkable | 是否可以被勾选 | bool | false | 0.0.5 | |defaultExpandedKeys | 默认展开的树节点的id集合 | number[] | [] | 0.0.5 | |defaultExpandAll | 是否默认展开所有树节点 | bool | false | 0.0.5 | |defaultCheckedKeys | 默认勾选的树节点的id集合 | number[] | [] | 0.0.5 | |checkedKeys | 勾选的树节点的id集合(当使用该属性时defaultCheckedKeys会失效) | number[] | [] | 0.0.7 | |selectedKeys | 选中的树节点的id集合(click) | number[] | [] | 0.0.5 | |checkStrictly | 子节点不影响父节点的勾选 | bool | false | 0.0.5 | |onCheck | 勾选或取消勾选树节点的方法 | func(ids, e:{info, checked, node}) | - | 0.0.5 | |onSelect | 选中(click)或取消选中树节点的方法 | func(ids, e:{info, selected, node}) | - | 0.0.5 | |loadData | 异步加载树节点的方法 | func(node) | - | 0.0.5 | |onMouseEnter | 鼠标进入树节点 | func({event,node}) | - | 0.0.5 | |onMouseLeave | 鼠标离开树节点 | func({event,node}) | - | 0.0.5 |

TreeNode props(树节点相关)

| name | description | type | default | since | |----------|----------------|----------|--------------|-------| |className | 节点的class | String | '' | 0.0.5 | |disabled | 节点不能被点击 | bool | false | 0.0.5 | |disableCheckbox | 节点不能被勾选 | bool | false | 0.0.5 | |title | 树节点的展示内容 | String/element | '---' | 0.0.5 | |key | 用于确定唯一的key | String | - | 0.0.5 | |isLeaf | 是否为叶子节点 | bool | false | 0.0.5 |

示例

一个简单的 异步 加载树节点的例子

// actions.js
import ajax from 'vj-ajax';
export const RECEIVE_TREENODE_SUCCESS = 'RECEIVE_TREENODE_SUCCESS';
export const RECEIVE_TREENODE_FAIL = 'RECEIVE_TREENODE_FAIL';

const fetchTreeNode = (pid = 0, loadedIds) => dispatch => {
  if (loadedIds.indexOf(pid) > -1) { // pid 为请求的节点id
    return new Promise(resolve => {
      resolve();
    });
  };
  return ajax({
    url: 'xxx',
    data: {
      pid,
    },
  }).then(data => {
    dispatch({
      type: RECEIVE_TREENODE_SUCCESS,
      text: '树节点请求成功',
      data: {
        list: data.list || [], // node的数组
        pid: pid,
      }
    });
  }).catch(error => {
    dispatch(fail(RECEIVE_TREENODE_FAIL, '树节点请求失败', error));
  });
};

export default { fetchTreeNode }


// reducers.js
import { RECEIVE_TREENODE_SUCCESS, RECEIVE_TREENODE_FAIL } from './actions.js';

const treeInitData = {
  fetching: true,
  loadedIds: [],
  treeData: [],
};

// 查找node节点
const findNode = (data, id) => {
  let parent = null
  const loop = data => {
    for (var i = 0, l = data.length ; i < l; i++) {
      if (data[i].id == id) {
        parent = data[i];
        break;
      };
      if (data[i].children) {
        loop(data[i].children);
      };
    };
  };
  loop(data);
  return parent;
};

const filterNodes = (state, nextData) => {
  let { treeData, loadedIds } = state;
  let { list, pid } = nextData;
  let parentNode = findNode(treeData, pid);
  const filter = data => {
    for (var i = 0, l = data.length; i < l; i++) {
      data[i].isLeaf = data[i].is_leaf || false;
      data[i].parentId = data[i].parent_id || 0; // 按需
      data[i].key = parentNode ? `${parentNode.key}-${data[i].id}` : `${data[i].id}`;
      data[i].fullName = parentNode ? `${parentNode.fullName}->-${data[i].name}` : `${data[i].name}`; // 按需
      data[i].sortId = data[i].sort_id || 0; // 按需
      // 在这里处理TreeNode props
    };
  };
  filter(list);
  if (parentNode) {
    parentNode.children = list;
  } else {
    treeData = list;
  };
  loadedIds.push(pid);
  return {
    treeData,
    loadedIds,
  };
};

const tree = (state = treeInitData, action) => {
  switch (action.type) {
    case RECEIVE_TREENODE_SUCCESS:
      return {
        ...filterNodes(state, action.data),
        success: true,
        fetching: false,
      };
    case RECEIVE_TREENODE_FAIL:
      return {
        ...state,
        error: action.error,
        success: false,
        fetching: false,
      };
    default:
      return state;
  };
};

export default { tree };


// VjTree.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
import Tree from 'vj-tree';

import actions from './actions.js';

class VjTree extends Component {
  constructor(props) {
    super(props);
  };
  handleLoadData = node => {
    const { loadedIds, fetchTreeNode } = this.props;
    fetchTreeNode(node.props.id, loadedIds);
  };
  render() {
    const { tree: { treeData } } = this.props;
    return (
      <Tree
        treeData={treeData}
        loadData={this.handleLoadData}
      />
    );
  };
};

const mapStateToProps = state => {
  const { tree } = state;
  return { tree };
};

export default connect(mapStateToProps, actions)(VjTree);