React Native:用户单击发送按钮而不刷新时显示消息

时间:2019-06-21 13:28:13

标签: react-native

我仅使用状态创建了一个简单的聊天应用系统。

class Messages extends React.Component {
  constructor(props) {
      super(props)
      this.state = {
        msg: [], //all messages in db
        msgS: '', // message send on click
      }
  }
  async sendMsgS() {
      let formData = new FormData();
      formData.append('key', '***'); // API key
      formData.append('userId', '1');
      formData.append('msg', this.state.msgS);
    try {
      let response = await fetch('https://www.globalfidelio.com/gfn_arcol/api/send_msg.php',{
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'multipart/form-data'
        },
        body: formData
      });

      let res = await response.json();

      if(response.status >= 200 && response.status < 300 ) {

        console.warn("message envoyé " + res.message);

      } else {
        let errors = res;
        throw errors;
      }

    } catch (errors) {
        console.warn("error msg is_  " + errors);
    }
  };
  onPressSend() {
    this.sendMsgS().then(() => {
      this.setState({msgS: ''})
    });
    console.log(this.state.msg.Conversation.reverse());
  }

  componentDidMount() {
    getMsgFromApi().then(data => {
      this.setState({ msg: data})
    });

  };

它可以正常工作,但是当我单击sen按钮时,我必须刷新才能显示我发送的消息,而我希望它不刷新就显示我发送的消息。 我不知道该怎么办

2 个答案:

答案 0 :(得分:0)

这是行为上的反应。如果更改状态,则应调用render方法。为了避免这种情况,您可以使用以下生命周期方法:

shouldComponentUpdate(nextProps, nextState)

我看不到您的render方法来查看如何显示味精。但是,如果没有刷新,您将无法显示任何更改(但会发出警报)。

在这里shouldComponentUpdate文档link

答案 1 :(得分:0)

我通过添加extraData Flatlist属性找到了解决方案:

  <FlatList
    style={Styles.flatlist}
    data={this.state.msg.Conversation}
    keyExtractor={(item) => item.datetime.toString()}
    extraData={this.state} //this prop
    renderItem={({item}) => <MsgR msg={item}/>}
    inverted= {-1}
  />

当我单击发送按钮时,我重新调用getMsgFromApi()方法:

onPressSend() {
  AsyncStorage.getItem(USERID_STORED)
      .then(userIdStore => {
              this.setState({ userId: userIdStore});
              this.sendMsgS(this.state.userId).then(() => {
                this.setState({msgS: ''});
this method --> this.getMsgFromApi(this.state.userId).then(data => {
                  this.setState({ msg: data,});
                });
              });
      });
}

并且工作正常:当我单击“发送”按钮时,几秒钟后我就显示了已发送的消息,虽然不愉快,但是可以正常工作!