在用react-sortable-tree这个组件遇到了问题,如果能帮忙的话,有偿!

#1

因为国内用的人太少了,并且作者的例子也写的有点模糊,issue也不回了。所以现在找有来论坛着用过的,或者能快速了解这个组件的人。如果能帮忙解决的话,我愿意提供500-1000的答谢。

#2

我简单的说下遇到的问题和我的需求,可以添加子元素和删除子元素,这个我已经做了。现在我把该组件变成一个可以输入的input,输入完成后可以保存在state里面。它有个自带的属性nodeContentRenderer是可以最大权限的定义组件,但是我不清楚怎么去用。

#3
class Aom extends Component{
    constructor(props){
        super(props);
        this.state = {
            treeData:[{title:(
                <input type="text" placeholder="请输入选项的文字" ref='inputValue'/>
            )}],
            showTree:true,
            value:'',
            childerValue:''
        }
    }
    render(){
        return (
            <div className={this.state.showTree ?  "showContainPart" : "hideContainPart" }>
                <div onClick={()=>this.setState({showTree:false})} className='delete-btn'>删除</div>
                <SortableTree
                    className="test"
                    treeData={this.state.treeData}
                    onChange={treeData => this.setState({ treeData })}
                    scaffoldBlockPxWidth={300}
                    generateNodeProps={rowInfo => ({
                        buttons: [
                            <button onClick={(event) => this.addNode(rowInfo)}>addchirld</button>,
                            <button onClick={(event) => this.addSameNode(rowInfo)}>add</button>,
                            <button onClick={(event) => this.saveNode(rowInfo)}>save</button>


                        ],
                    })}
                />
            </div>
        )
    }
    /*removeNode(rowInfo) {
        let {node, treeIndex, path} = rowInfo;
        const deleteNode = removeNodeAtPath({
            treeData: this.state.treeData,
            path: path,   // You can use path from here
            getNodeKey: ({node: TreeNode, treeIndex: number}) => {
                return number;
            },
            ignoreCollapsed: false,
        });
        this.setState({
            treeData:deleteNode
        })
        console.log(this.state.treeData[0])
    }*/
    saveNode(rowInfo){
        const input = ReactDOM.findDOMNode(this.refs.inputValue);
        const value = input.value;
        let NEW_NODE = {title:value};
        let { path } = rowInfo;
        console.log(rowInfo);
        let newTree = changeNodeAtPath({
            treeData: this.state.treeData,
            path:path,
            newNode: NEW_NODE,
            getNodeKey: ({ treeIndex }) =>  treeIndex
        });
        this.setState({treeData: newTree});
    }
    addSameNode(rowInfo){
        {
            let NEW_NODE = {title:(
                <fuck />
            )};
            let {node, treeIndex, path} = rowInfo;
            path.pop();
            let parentNode = getNodeAtPath({
                treeData: this.state.treeData,
                path : path,
                getNodeKey: ({ treeIndex }) =>  treeIndex,
                ignoreCollapsed : true
            });
            let getNodeKey = ({ node: object, treeIndex: number }) => {
                return number;
            };
            let parentKey = getNodeKey(parentNode);
            if(parentKey === -1) {
                parentKey = null;
            }
            console.log(parentKey);
            let newTree = addNodeUnderParent({
                treeData: this.state.treeData,
                newNode: NEW_NODE,
                expandParent: true,
                parentKey: parentKey,
                getNodeKey: ({ treeIndex }) =>  treeIndex
            });
            this.setState({treeData: newTree.treeData});
        }
    }
    addNode(rowInfo) {
        let NEW_NODE = {
            title: (
                <fuck />
            )
        };
        let { path} = rowInfo;
        let newTree = addNodeUnderParent({
            treeData: this.state.treeData,
            newNode: NEW_NODE,
            expandParent: true,
            parentKey: path.pop(),
            getNodeKey: ({treeIndex}) => treeIndex
        });
        this.setState({treeData: newTree.treeData});
    }
}
#4

因为不会用那个属性,所以我是把input当作title插入treeData里面,然后通过自带的change方法改变node,但是这样显然有问题,因为后面加入的子元素如果带有ref属性就会报错。

#5

真的希望有人用过或者了解过的人帮忙解答一下,可以加我私聊532712826

#6

这个插件源码很少,你完全可以去看一下,比如nodeContentRenderer传入的是一个function

nodeContentRenderer: PropTypes.func

然后把nodeContentRenderer传入了dndWrapSource的el参数

export function dndWrapSource(el, type) {
   return dragSource(type, nodeDragSource, nodeDragSourcePropInjection)(el);
}

然后去下面这个文件分析一下

react-sortable-tree/src/utils/drag-and-drop-utils.js

#7

我现在把他整个defaut文件引入,还是没用,没有它自带的功能,样式也没了。

#8

这个插件在 redux环境下跑不起来,请问你知道为什么吗?