2016-10-17 2 views
0

У меня есть образец кода для генерации дерева. Но он показывает ошибки, которые this.state.action или this.onClickNode не определены, пока я определил их все в конструкторе.«this.state» или методы недоступны в Reactjs

export default class TreeList extends React.Component { 
    constructor(props) { 
    super(props) 
    this.state = {tree: tree, action: null} 
    this.onClickNode = this.onClickNode.bind(this) 
    } 
    onClickNode(node) { 
    this.setState({active: node}) 
    } 
    renderNode(node) { 
    console.log(this.state.action) 
    return (
     <span onClick={this.onClickNode(null, node)}> 
     {node.module} 
     </span> 
    ); 
    } 
    render() { 
    return (
     <div> 
     <Tree tree={this.state.tree} renderNode={this.renderNode}/> 
     </div> 
    ) 
} 

}

Я использовал эту библиотеку: https://pqx.github.io/react-ui-tree/

+3

Возможно, вам нужно связать 'this' для функции' this.renderNode', например. This.renderNode = this.renderNode.bind (this) ' –

+0

состояние недоступно через' onClickNode'? Кстати, вы знаете, что вы устанавливаете 'this.state.action' в' null' вместо 'node', потому что это ваш первый параметр внутри' onClickNode' .. – Ido

+0

@ И да, это значение null, и оно должно возвращать «null», но вместо этого он возвращает undefined. – Mortezaipo

ответ

1

Вы должны связать this к вашей renderNode функции, потому что this является not automatically bound для классов ES6. В противном случае у вас не будет соответствующего контекста в вашей функции. Вот почему ваш this.state.action не определен и почему он не может решить this.onClickNode.

В конструкторе добавьте

this.renderNode = this.renderNode.bind(this); 

Кроме того, если вы хотите использовать узел в обработчике OnClick, вы можете переключить его в

onClickNode(firstParam, node) { 
    return (event) => { 
     this.setState({active: node}) 
    } 
    } 

Я предполагаю, что то, что происходит в том, что this.renderNode выполняется при вызове render(), который затем выполняет this.onClickNode, а затем обновляет номер state. Ну, так как обновляется state, он снова вызовет render().

+0

Спасибо за ваш ответ, но когда я определил 'this.renderNode = this.renderNode.bind (это);' он пойдет в бесконечный цикл, и мой браузер будет разбит. – Mortezaipo

+0

@Mortezaipo Я также заметил, что ваш обработчик 'onClick' выполняет функцию' this.onClickNode (null, node) ', а не просто передает ссылку на функцию. Вероятно, вы должны иметь 'this.onClickNode' вернуть функцию, которая затем содержит ваш объект' node'. Это может быть источником вашего бесконечного цикла. –

+0

Поэтому я должен добавить это вместо: 'onClick = {this.onClickNode}'? – Mortezaipo

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