我正在创建一个基于WebSocket的聊天应用程序来try Fresh,但我正在努力将基本的消息列表呈现到页面上.以下是一些代码:

routes/chat.tsx

export default function Chat() {
    return (
        <div>
            // ...
            <MyIsland username={username.value}></MyIsland>
        </div>
    )
}

islands/MyIsland.tsx

export default function MyIsland(props: IslandProps) {

    const ws = useSignal<WebSocket | null>(null);
    const messageList = useSignal<Message[]>([]);

    useEffect(() => {
        if (props.username) {
            ws.value = new WebSocket("ws://localhost:5000?username=" + props.username);
            ws.value.onopen    = ()  => { console.log('Connected..') }
            ws.value.onmessage = updateMessages;
        }
    }, []);

    const updateMessages = useCallback((m: MessageEvent<string>) => {
        const data: WsData = JSON.parse(m.data);
    
        if (data.type == SocketMessageType.Text){
            const message: Message = data.value;
            messageList.value.push(message);
        }
    }, [])

    const send = useCallback((text: string) => {
        if (ws.value) {
            const data = // ...
            ws.value.send(JSON.stringify(data));
        }
    }, [ws]);

    return (
        <div>
            <Button onClick={() => send('test')}>Send</Button>
            <div>
                {messageList.value.map((m) => ( <MessageItem {...m} /> ))} // problem here
            </div>
        </div>
    )
}

我希望当列表中充满消息时,MyIsland底部的messageList.value.map会在页面上更新,但事实并非如此.我已经验证了列表是否在后台正确更新,只是html没有更新.总的来说,我对Fresh和服务器+客户端呈现的框架非常陌生,所以我怀疑我可能误解了这些岛屿的呈现方式.谢谢你的帮助!

推荐答案

您的状态没有更新,因为您的数组引用没有更改.您需要将一个新数组赋给messageList.value,才能使其更新状态.

而不是

MessageList.value.ush(Message);

MessageList.value=[...MessageList.Value,Message];

它会像你预期的那样工作.

Typescript相关问答推荐

带有联合参数的静态大小数组

忽略和K的定义

我们过go 不能从TypeScript中的联合中同时访问所有属性?

如何正确地对类型脚本泛型进行限制

如何在TypeScript中将一个元组映射(转换)到另一个元组?

有条件地删除区分的联合类型中的属性的可选属性

如何消除在Next.js中使用Reaction上下文的延迟?

有没有可能为这样的函数写一个类型?

MatTool提示在角垫工作台中不起作用

如何 bootstrap TS编译器为类型化属性`T`推断正确的类型?

`fetcher.load`是否等同于Get Submit?

编译TypeScrip项目的一部分导致错误

如何静态键入返回数组1到n的函数

有没有办法在Reaction组件中动态导入打字脚本`type`?

递归类型别名的Typescript 使用

类型脚本中函数重载中的类型推断问题

如何将对象的字符串文字属性用作同一对象中的键类型

为什么 TypeScript 类型条件会影响其分支的结果?

我是否应该在 Next.js 中的服务器组件中获取秘密数据的所有函数中使用使用服务器?

如何在没有空接口的情况下实现求和类型功能?