2016-10-25 4 views
2

У меня есть простой компонент, называемый Списком которая является простым улем с некоторыми литием внутри. Каждый li - простой компонент. У меня есть другой родительский компонент, который отображает одно поле ввода и Список. Нажатие на Отправить ключ Я поймаю текст поля ввода. Я хочу вызвать, например, функцию с именем handleNewText (inputText), но эта функция должна оставаться внутри компонента List, потому что состояние, которое я использую для заполнения других li компонентов в реальном времени Список Компонент.Вызова дочернего метод компонента из родительских в реакцию

Я не хочу рефакторировать компонент List и MyParent, передающий управление данными из списка в MyParent.

первым является родитель и второй ребенком

class TodoComp extends React.Component { 
 
    constructor(props){ 
 
    super(props); 
 
    this.handleKeyPress = this.handleKeyPress.bind(this); 
 
    } 
 

 
    componentDidMpunt(){ 
 
    console.log(this._child.someMethod()); 
 
    } 
 

 

 
    handleKeyPress(event){ 
 
    if(event.key === 'Enter'){ 
 
     var t = event.target.value; 
 

 
    } 
 
    } 
 

 
    render(){ 
 
    return (
 
     <div> 
 
      <input 
 
      className="inputTodo" 
 
      type="text" 
 
      placeholder="want to be an hero...!" 
 
      onKeyPress={this.handleKeyPress} 
 
      /> 
 
      <List/> 
 
     </div> 
 
    ); 
 
    } 
 

 
} 
 

 

 
export default class List extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    this.flipDone = this.flipDone.bind(this); 
 
    this.state = { 
 
     todos: Array(3).fill({ content: '', done: false}) 
 
    }; 
 
    } 
 

 
    flipDone(id) { 
 
    let index = Number(id); 
 

 
    this.setState({ 
 
     todos: [ 
 
     ...this.state.todos.slice(0, index), 
 
     Object.assign({}, this.state.todos[index], {done: !this.state.todos[index].done}), 
 
     ...this.state.todos.slice(index + 1) 
 
     ] 
 
    }); 
 
    } 
 

 
    render() { 
 

 
    const myList = this.state.todos.map((todo, index) => { 
 
     return (
 
     <Todo key={index} 
 
       clickHandler={this.flipDone} 
 
       id={index} 
 
       todo={todo} 
 
       handleText={this.handleText} 
 
     /> 
 
    ); 
 
    }) 
 

 
    return (
 
     <ul className="list"> 
 
     {myList} 
 
     </ul> 
 
    ); 
 
    } 
 

 

 
ReactDOM.render(<TodoComp />,document.getElementById('myList'));

+0

Можете ли вы показать свой код? –

ответ

4

Вы должны использовать реф для вызова функции в компоненте ребенка от родительского компонента

визуализации списка компонента от родителя как

<List ref="myList"/> 

, а затем получить доступ к функции handleNewText(), как this.refs.myList.handleNewText()

UPDATE:

Строки рефов больше не рекомендованные React, вы скорее должны использовать реф обратные вызовы, проверьте this

<List ref={(ref) => this.myList=ref}/> 

и затем доступ детская функция, такая как

this.myList.handleNewText() 
Смежные вопросы