2017-02-10 2 views
1

Я начал использовать React, и я хочу добавить компонент response-tree в свой проект. Я пытаюсь удалить узел в функции RemoveNode():Удалить узел в обработанном обработкой дереве

removeNode(e){ 
    this.setState({ 
      treeData: removeNodeAtPath({ 
       treeData: this.state.treeData, 
       path: ????, 
       getNodeKey: ({node: TreeNode, treeIndex: number}) => { 
        console.log(number); 
        return number; 
       }, 
       ignoreCollapsed: false, 
      }) 
    }) 
} 

, как я могу получить узел пути в моем случае? весь мой файл App.js:

export default class TreeVera extends Component { 
constructor(props) { 
    super(props); 
    this.updateTreeData = this.updateTreeData.bind(this); 
    this.removeNode = this.removeNode.bind(this); 
    this.state = { 
     treeData: [{ 
      title: (<div> 
        <input /> 
        <button onClick={this.removeNode}>remove</button> 
       </div>), 
     }] 
    }; 
} 
removeNode(e){ 
    this.setState({ 
      treeData: removeNodeAtPath({ 
       treeData: this.state.treeData, 
       path: ????, 
       getNodeKey: ({node: TreeNode, treeIndex: number}) => { 
        console.log(number); 
        return number; 
       }, 
       ignoreCollapsed: false, 
      }) 
    }) 
} 
updateTreeData(treeData) { 
    this.setState({ treeData }); 
} 
render() { 
    return (
     <div style={{ height: 600 }}> 
      <SortableTree 
       treeData={this.state.treeData} 
       onChange={this.updateTreeData} 
      /> 
     </div> 
    ); 
} 

компонентов на GitHub: https://github.com/fritz-c/react-sortable-tree

ответ

3

Я решил эту проблему:

export default class Tree extends Component { 

constructor(props) { 
    super(props); 
    this.updateTreeData = this.updateTreeData.bind(this); 
    this.addNode = this.addNode.bind(this); 
    this.removeNode = this.removeNode.bind(this); 
    this.state = { 
     treeData: [{ 
      title: '', 
     }] 
    }; 
} 

getChildContext() { 
      return { muiTheme: getMuiTheme(baseTheme) }; 
     } 
addNode(rowInfo){ 
    let NEW_NODE = {title: ''}; 
    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; 
    } 
    let newTree = addNodeUnderParent({ 
      treeData: this.state.treeData, 
      newNode: NEW_NODE, 
      expandParent: true, 
      parentKey: parentKey, 
      getNodeKey: ({ treeIndex }) => treeIndex 
    }); 
    this.setState({treeData: newTree.treeData}); 
} 

removeNode(rowInfo) { 
let {node, treeIndex, path} = rowInfo; 
this.setState({ treeData : removeNodeAtPath({ 
        treeData: this.state.treeData, 
        path: path, // You can use path from here 
        getNodeKey: ({node: TreeNode, treeIndex: number}) => { 
         // console.log(number); 
         return number; 
        }, 
        ignoreCollapsed: false, 
       }) 
    }) 
} 

updateTreeData(treeData) { 
    this.setState({ treeData }); 
} 

render() { 
    return (
     <div style={{ height: 600 }}> 
      <SortableTree 
        treeData={this.state.treeData} 
        onChange={this.updateTreeData} 
        generateNodeProps={rowInfo => ({ 
         buttons: [ 
            <div style={divStyle}> 
            <TextField 
             hintText="" 
             multiLine={true} 
             rows={1} 
             rowsMax={4} 
            /><br /> 
            <button label='Delete' 
              onClick={(event) => this.removeNode(rowInfo)}>Remove</button> 
            <button label='Add' 
              onClick={(event) => this.addNode(rowInfo)}>Add</button> 
            </div>, 
           ], 
         style: { 
            height: '50px', 
           } 
         })} 


      /> 
     </div> 
    ); 
} 

}

+0

я не могу получить ваш пример работы. Я получаю ошибку на

+0

да, вы можете получить сообщение об ошибке, потому что я использовал TextField из рамки material-ui, вы можете получить код по ссылке: http://www.material-ui.com/#/компоненты/текстовые поля – Vladimir

Смежные вопросы