React Hooks and ActionCable

问题描述 投票:1回答:1

[试图与React新的Hooks和ActionCable相处,但是遇到了在尝试发送状态时无法在Rails中获得正确数据的问题。

我已经尝试在执行send()之后立即使用setState()方法并发送了更新的数据,但是由于某些原因,在Rails部件上接收到的数据是旧的。例如,如果在输入中输入“ Example”,则会在Rails端看到“ {{data” =>“ Exampl”}。我认为数据更新状态要晚于请求的执行时间。如果我send()e.target.value值一切正常

因此,我尝试使用新的useEffect()挂钩并在那里发送数据。但是我在渲染页面时只得到数据。之后,我什么也没得到,有时会出错RuntimeError - Unable to find subscription with an identifier。似乎效果钩子太早发送数据了。

我对Hooks和WebSocket还是很陌生。希望在这里获得任何帮助。我可以共享Rails代码,但是只有一个接收器,没有别的。

第一例:

import React, { useState, useEffect } from "react"
import ActionCable from 'actioncable'

function Component(props) {
const [data, setData] = useState("");

const cable = ActionCable.createConsumer('ws://localhost:3000/cable');
const sub = cable.subscriptions.create('DataChannel');

const handleChange = (e) => {
 setData(e.target.value)
 sub.send({ data });
}

return (
  <input value={data} onChange={handleChange}/>
 )
}

[尝试使用效果并在其中移动send()

  useEffect(() => {
    sub.send({ data });
  }, [data]);

我很想找到一种正确使用React和ActionCable的方法。并尽可能使用钩子。

javascript ruby-on-rails reactjs actioncable
1个回答
0
投票

您可以像这样在根组件上注册电缆:

import actionCable from 'actioncable';

(function() {
  window.CableApp || (window.CableApp = {});
  CableApp.cable = actionCable.createConsumer('ws://localhost:3000/cable')
}).call(this);`

因此它将可以用作全局变量;

然后在要创建通道并发送数据的任何组件中:

const [channel, setChannel] = useState(null);
          useEffect(() => {
         CableApp.cable.subscriptions.create(
          {
            channel: 'YourChannelName',
          },
          {
            initialized() {
              setChannel(this)
            },
          },
        );
      }, []);

return <button onClick={() => channel.send(some_data)} >Send counter</button>
© www.soinside.com 2019 - 2024. All rights reserved.