Реагируйте. Список -> щелкнуть по списку и отправить параметры

#javascript #reactjs

#javascript #reactjs

Вопрос:

Не могу понять, как я могу создать щелчок по элементу в списке и отправленные параметры. Например, если я использую этот код

     <List>
         {filesList ? (
           filesList.map((item, index) => (
            <ListItem key={index} button onClick={this.setCurrentUrl(index)}>
               <ListItemIcon>
                   <InsertDriveFile/>
               </ListItemIcon>
               <ListItemText primary={item.name} />
            </ListItem>
        ))
    ) : (
            <ListItem>There are no attachement files</ListItem>)}
            <ListItem/>
      </List>
  

метод setCurrentUrl :

 setCurrentUrl(index) {
        console.log(index);
    }
  

я буду выводить все элементы в консоль при загрузке моей страницы. Почему? Но если я сделаю что-то вроде этого:

 <ListItem key={index} button onClick={this.setCurrentUrl} value={index}>
  

и

 setCurrentUrl(event) {
        console.log(event);
    }
  

тогда console.log(event); будет вызываться только тогда, когда я нажимаю на элемент в списке. Но таким образом я не знаю, как отправлять параметры в setCurrentUrl

Комментарии:

1. Вы можете сделать что-то вроде : onClick={() => this.setCurrentUrl(index)}

Ответ №1:

Способ, которым вы используете

  <ListItem key={index} button onClick={this.setCurrentUrl(index)}>
  

это проблематично, поскольку функция setCurrentUrl будет вызвана, как только компонент будет отрисован. Чтобы вызвать функцию только при срабатывании события onClick, вам необходимо использовать обратные вызовы.

 <ListItem key={index} button onClick={() => this.setCurrentUrl(index)}>
  

Использование обратного вызова не вызовет функцию во время визуализации компонента и вызовет функцию только при срабатывании события onClick.

Ответ №2:

Причина, по которой это происходит, заключается в том, что вы вызываете функцию. Функция будет выполнена сразу после визуализации компонента.

  <ListItem key={index} button onClick={this.setCurrentUrl(index)}>
  

Вместо этого вам следовало бы сделать

 <ListItem key={index} button onClick={() => this.setCurrentUrl(index)}>
  

Что это сделает, так это назначит функцию обработчику onClick и будет вызываться только при нажатии кнопки.