0.0.8 • Published 8 years ago

vj-tree v0.0.8

Weekly downloads
1
License
ISC
Repository
-
Last release
8 years ago

vj-tree

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

安装

$ npm i vj-tree -S

API

scrollWrap props(外层的滚动包裹)

namedescriptiontypedefaultsince
scrollClassreact-custom-scrollbars的classString''0.0.5
scrollStylereact-custom-scrollbars的styleString''0.0.5
autoHeightreact-custom-scrollbars是否为高度自适应boolfalse0.0.5
autoHeightMin当autoHeight为true时生效number00.0.5
autoHeightMax同上number1200.0.5

Tree props(树相关)

namedescriptiontypedefaultsince
treeClassrc-tree的classString''0.0.5
treeData树的数据源array[]0.0.5
showIcon是否显示前面的图标boolfalse0.0.5
multiple是否可以被多选(select)boolfalse0.0.5
selectable是否可以被select(click)booltrue0.0.5
checkable是否可以被勾选boolfalse0.0.5
defaultExpandedKeys默认展开的树节点的id集合number[][]0.0.5
defaultExpandAll是否默认展开所有树节点boolfalse0.0.5
defaultCheckedKeys默认勾选的树节点的id集合number[][]0.0.5
checkedKeys勾选的树节点的id集合(当使用该属性时defaultCheckedKeys会失效)number[][]0.0.7
selectedKeys选中的树节点的id集合(click)number[][]0.0.5
checkStrictly子节点不影响父节点的勾选boolfalse0.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(树节点相关)

namedescriptiontypedefaultsince
className节点的classString''0.0.5
disabled节点不能被点击boolfalse0.0.5
disableCheckbox节点不能被勾选boolfalse0.0.5
title树节点的展示内容String/element'---'0.0.5
key用于确定唯一的keyString-0.0.5
isLeaf是否为叶子节点boolfalse0.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);
0.0.8

8 years ago

0.0.7

8 years ago

0.0.6

8 years ago

0.0.5

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago

0.0.1

8 years ago