@Vlad171

Как получить promise при обработке onClick события?

Не могу разобраться в последовательности работы приложения, скорее с последовательностью изменения состояния. Приложение дублирует функционал работы сообщений в сети VK и основано соответственно на его API. Работает через wrapper 'vk-sdk' Нужно отображение входящих сообщений из группы в ВК в админке сайта с возможностью ответа. Код приложения:
import vk from 'vk-sdk'
import React from 'react'
import ReactDOM from 'react-dom'
const url="api-url";
vk.setToken('мой-токен-ВК');
class Message extends React.Component {
       constructor(props) {
          super(props);
          this.state = {
             mes:[],
             value:'',
          };
        };
       componentDidMount(){
        fetch(url).then(function(response){
            return response
        }).then(function (response) {
            return response.json()
        }).then((data)=>{
            this.setState({mes:data})
        })
        }
        handleChange(event) {
            this.setState({value: event.target.value});
         }
        subFunction(props) {
            const id=props.user_id;
            vk.callMethod('messages.send', {
                 user_id: id,
                 message: this.state.value
             })
             .then(function (response) {
                 console.log('Success: ' + JSON.stringify(response));
             })
             .catch(function (error) {
                 console.log('Fail: ' + JSON.stringify(error));
              });
        }
        render() {
            return (
                <div className="mp_dt_vk_list_mes_wr">
                {this.state.mes.map((index)=>
                    (
                        <div className="vk_message_wrap" key={index.message_id}>
                            <div className="vk_info_wr">
                                <div className="vk_image">
                                    <img className="circle" src={index.image_url}>

                                    </img>
                                </div>
                                <div className="vk_mes_username_wr">
                                    {index.last_name}
                                    {index.first_name}
                                </div>
                            </div>
                            <div className="vk_content">
                                <div className="vk_mes_date">
                                     {index.message_date}
                                </div>
                                <div className="vk_title">
                                    {index.message_title}
                                </div>
                                <div className="vk_body">
                                    {index.message_body}
                                </div>
                                <form className="col s12">
                                <div className="row">
                                     <div className="input-field col s12">
                                         <textarea id="textarea1" className="materialize-textarea" value={this.state.value} onChange={this.handleChange.bind(this)}/>
                                         <label htmlFor="textarea1">
                                             Ответ
                                         </label>
                                     </div>
                                </div>
                                    <button className="vk_mess_button btn waves-effect waves-light blue darken-3" onClick={this.subFunction.bind(this,index)}>
                                        Отправить
                                    </button>
                                </form>
                            </div>
                        </div>
                    )
              )
                }
            </div>
            );
        }
    }
ReactDOM.render(<Message/>, document.getElementById('containercustom'));

При обработке componentDidMount я получаю список всех сообщений, далее передаю их в Message через map c выводом названия, даты, имя пользователя и т.д. После ввода ответа в textarea, по нажатию на кнопку должна отрабатывать функция subFunction, которая отправляет ответ через метод send.messages. И вот здесь возникает загвоздка - метод не отрабатывает или же запрос проходит через раз. После нескольких нажатий, возможна отправится одно сообщение, либо вообще ничего не происходит. Проверял работает ли метод, если его вызвать с этими же параметрами, но отдельно, если оставить одну кнопку и обрабатывать событие нажатия - все работает отлично. Я подозреваю, что причина в работе с состоянием компонента - при нажатие на кнопку происходит ререндер компонента, возможно запрос при этом не осуществляется.
Кто нибудь мог бы мне объяснить в чем причина такого поведения и где я ошибаюсь.
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
@Vlad171 Автор вопроса
Вопрос с безпричинным ререндером по клику решился после удаления тега из компонента. После этого все заработало, сообщения отправляются. Точной причины такого поведения и то, как это связано с form понять пока не могу. Так же как и не читал,что react как то по особому его рендерит. В остальном проверил код на отсутствие других возможных подключенных скриптов, которые могли бы взаимодействовать с тегом - ничего нет. За неимением другого решения, оставлю это в качестве ответа.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Предположим, что с subFunction все ок.

Но далее то что должно происходить? Компонент у вас примонтирован (componentDidMount случился), на изменение props он у вас никак не реагирует (не вижу в коде componentWillReceiveProps), так же не вижу, чтобы что-то передавалось в родителя. Вывод: вы вызываете subFunction, она делает свою работу и все на этом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы