【问题标题】:Live-wire - real time chat not responding correctlyLive-wire - 实时聊天没有正确响应
【发布时间】:2020-11-06 07:19:27
【问题描述】:

我正在尝试使用 live-wire 来了解如何在我即将进行的项目中实施它。这个想法是一个简单的聊天(用户输入一段文本并点击发送,然后消息将在聊天的底部)

到目前为止一切正常,直到我点击发送按钮。

这是我点击发送前的图片

这是我点击发送后发生的情况

我觉得问题出在我将消息发送到火线刀片的这部分代码中

  @foreach ($messages as $message)
            @if($message->isYou())
                <livewire:conversations.conversation-message-own :message="$message" :key="$message->id" />
            @else
                <livewire:conversations.conversation-message :message="$message" :key="$message->id" />
            @endif
        @endforeach

这是组件

public $body= "";
public $conversation;

public function mount(Conversation $conversation)
{
    $this->conversation = $conversation;
}

public function reply()
{
    $this->validate([
        'body' => 'required',
    ]);
    $message = $this->conversation->messages()->create([
        'user_id' => user()->id,
        'body' => $this->body,
    ]);
    $this->emit('message.created',$message->id);
    $this->body = "";
}
public function render()
{
    return view('livewire.conversations.conversation-reply');
}

}

last 是监听事件组件:

 class ConversationMessages extends Component
{

public $messages;

public function mount(Collection $messages)
{
    $this->messages = $messages;
}

public function render()
{
    return view('livewire.conversations.conversation-messages');
}
protected function getListeners()
{
    return [
    'message.created' => 'prependMessage',
    ];
}

public function prependMessage($id)
{
    $this->messages->prepend(Message::find($id));
}

} 检查日志中的问题是

Uncaught (in promise) TypeError: Cannot read property 'data' of null 但我认为这与聊天数据无关!

提前致谢

【问题讨论】:

  • 你能在监听消息创建事件中发布更多的组件吗?我想查看公共属性消息、渲染函数以及刀片
  • 感谢您的回复!你能在github.com/Abdulaziz-almoshen/SocialApp查看我的回购吗?

标签: javascript laravel-livewire


【解决方案1】:

问题在于传递给对话消息组件的键。 Livewire 会在尝试渲染这些组件时中断,即使使用 if 分隔也是如此。您将需要生成不同的密钥,例如字符串'message-own-' . $message-&gt;id'message-'. $message-&gt;id 。我用rand() 数据测试了你的代码:

@foreach ($messages as $message)
    @if($message->isOwn())
        <livewire:conversations.conversation-message-own :message="$message" :key="rand() * $message->id" />
    @else
        <livewire:conversations.conversation-message :message="$message" :key="rand() * $message->id" />
    @endif
@endforeach

【讨论】:

  • 再次感谢您的回答。有趣,因为我正在传递一个模型集合。我刚刚尝试了你写的模型集合出现错误Argument 1 passed to App\Http\Livewire\Conversations\ConversationMessages::mount() must be of the type array, object given, called in /Users/mac/Desktop/laravel/SocialApp/vendor/livewire/livewire/src/LivewireManager.php on line 109 (View: /Users/mac/Desktop/laravel/SocialApp/resources/views/conversations/show.blade.php) 也从 ConversationController 集合更改为数组,但出现用户未找到的错误
  • 我会在几个小时后在这里运行你的代码,检查这是否真的是问题
  • 抱歉,我的几个小时需要更长的时间。但错误出现在组件的键中
  • 没关系 :) 我认为键和前缀正在做一些混乱的工作。我会尝试找出解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多