reactjs - React 中的 Pusher 实现,丢失了上下文
问题描述
我正在做 Pusher 的基本实现,这是相关的部分:
const [messages, setMessages] = useState();
useEffect(() =>
{
//Fetching the messages from the API
fetchMessages().then(fetchedMessages => setMessages(fetchedMessages));
//Subscribing to a Pusher event in case of new messages
pusherChannel.bind(EVENT_MESSAGE_SENT, (data) =>
{
//Here, "messages" is empty, even when it has been filled by the API already
setMessages([...messages, data.message]);
});
}, []);
因此,我从 API 获取消息,然后通过 Pusher 监听新消息。
我遇到的问题是,在 的回调中pusherChannel.bind
,变量messages
是空的,即使它已经被 API 填充了。
也许回调发送messages
(和整个回调函数)的副本而不是引用?无论如何,我不知道如何使用该回调处理更新消息。
我已经看到绑定方法可以采用第三个“上下文”参数,但我不知道如何在挂钩中实现它。
解决方案
试试这个代码。我已将一个 useEffect 拆分为两个,添加一个isInit
在获取初始化消息数组后设置为 true 的变量,添加 useCallback。
const [messages, setMessages] = useState();
const [isInit, setIsInit] = useState(false);
const handleMessageSent = useCallback((data) => {
setMessages(prevState => ([...prevState, data.message]));
}, []);
useEffect(() => {
fetchMessages().then((fetchedMessages) => {
setMessages(fetchedMessages);
}).finally(() => {
setIsInit(true);
});
}, []);
useEffect(() => {
if (!isInit) {
return;
}
pusherChannel.bind(EVENT_MESSAGE_SENT, handleMessageSent);
return () => {
pusherChannel.unbind(EVENT_MESSAGE_SENT, handleMessageSent);
};
}, [isInit, handleMessageSent]);
推荐阅读
- android - 不能将RelativeLayout 转换为ImageView?
- clojure - 这个 Clojure 函数如何扩展?
- uitableview - UITableView editActionsForRowAt 在 Swift 5 中对 nil 没有正确反应
- docker - Docker Jenkins 工作节点缺少 docker 组
- javascript - 如何从对象的对象中获取键的最小值
- python - 在函数中传递这个字典
- wpf - 如何在使用 lambda 获取孩子时防止出现 null 错误?
- cplex - 如何为子模型设置时间限制?
- java - 将数组中的字符串转换为二维数组中的单词
- c# - 无法使用来自 C# 控制台项目之一的 log4net 将消息记录到 Application Insights