【发布时间】:2019-08-09 14:47:25
【问题描述】:
尝试与 React 新的 Hooks 和 ActionCable 相处,但遇到了在尝试发送状态时无法在 Rails 中获取正确数据的问题。
我尝试在执行setState() 后立即使用send() 方法并发送我更新的数据,但由于某种原因,Rails 部分收到的数据是旧的。
例如,如果我将“Example”放在输入中,我会在 Rails 端看到“{“data”=>“Exampl”}。我想数据更新状态晚于我的请求。
如果我 send() 的值来自 e.target.value 一切正常
因此,我尝试使用新的useEffect() 挂钩并在那里发送数据。但是我在渲染页面时只得到数据。之后,我什么也没有得到,有时会收到错误RuntimeError - Unable to find subscription with an identifier。好像效果挂钩太早发送数据之类的。
我对 Hooks 和 WebSockets 还是很陌生。很想在这里得到任何帮助。我可以共享 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}/>
)
}
尝试使用Effect并将send()移到那里:
useEffect(() => {
sub.send({ data });
}, [data]);
我很想找到一种正确使用 React 和 ActionCable 的方法。如果可能,请使用钩子。
【问题讨论】:
标签: javascript ruby-on-rails reactjs actioncable