每次有新通知时,我的组件都无法识别它

Every time there's a new notification, my component does not recognize it

我使用 Laravel 项目的 ReactJS 负责前端部分。目前我使用 Laravel Echo Server 实现通知。我很好地呈现和更新状态,但问题是每次有新通知时,我的组件都无法识别它。这是我的通知组件:

import React, {Component} from 'react';

import Echo from "laravel-echo";

class Notifications extends Component {

  constructor(props) {
    super(props);

    this.state = {
      userLogin: {}
    };

  }

  componentDidMount(){
    axios.post(laroute.route('api.get-users'))
      .then(res=>{
        this.setState({
          userLogin:res.data.userLogin
        });
      })
      .catch(err=>{
        console.log(err);
      })

    window.Echo.private('users.' + this.state.userLogin.id)
      .notification((notification) => {
        console.log(notification);
      });

  }

  render() {
    return (
      <span>
          Notifications
      </span>
    )
  }
}

export default Notifications;

我尝试将 ComponentDidMount 更改为 ConmponentWillMount,但它仍然无法接收通知。有趣的是,如果我将那些 Listening For Notifications 放在 blade 模板中,效果很好:

@section('header')
 ....
@endsection

@section('after-scripts')
    <script>

        var userId= "{{ access()->user()->id  }}";
        window.Echo.private('users.' + userId)
            .notification((notification) => {
                console.log(notification);
            });
</script>
@endsection

axios.post 会产生一个异步的值。但是你的 window.Echo.private 会在那之前 运行。将它移到里面并检查它是否有效。

在这里,试一试:

componentDidMount() {
  axios.post(laroute.route('api.get-users'))
    .then(res => {
      const { userLogin } = res.data;
      window.Echo.private('users.' + userLogin.id)
        .notification(notification => console.log(notification));
      this.setState({
        userLogin
      });
    })
    .catch(err => console.log(err))
}