javascript 我的React组件在我的数组对象属性更改时不会重新呈现

eimct9ow  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(118)

你好,我是React的新手。我有一个显示列表用户的react组件。数据来自对象数组。当我获取新的数据,改变了对象的属性,组件没有重新渲染。如何解决这个问题?
下面是我的代码:
homepage.js

...
const [users, setUsers] = useState([])

async function connWS() {
ws.onmessage = async function(message) {
  var parsedMessage = JSON.parse(message.data);
  console.info('Received message: ' + message.data);
        
  switch (parsedMessage.id) {
   case 'updateListUser':
   setUsers(parsedMessage.users);
  break;
}

useEffect(() => {
  async function init() {
    await connWS();
  }
  init();
}, []);

    return (
        <Layout
            isVideoCall={false}
            rightSection={
            <Users data={users} />
        </Layout>
    );

字符串
Users.js

const Users = ({data}) => {
return (
        <div className={styled.users}>
            {data.map((user) => (
                <div className={styled.userItem}>
                    {user.imageUrl ? (
                        <img src={""} alt={user.name} />
                    ) : (
                        <span style={{ backgroundColor: `#13c2c2` }}>
                            {user.shortName}
                        </span>
                    )}
                    <p>{user.name}</p>
                    {user.state ? (
                        user.state === 'REGISTERED' || 'registered' ? (
                            <p style={{ color: `#13c2c2` }}>Online</p>
                        ) : (
                            <p style={{ color: `#f5222d` }}>Offline</p>
                        )
                    ) : (
                        <p style={{ color: `#f5222d` }}>Offline</p>
                    )}
                    
                    <div className={styled.overlay}>
                        <Button
                            className={styled.callBtn}
                            type="dashed"
                            size="large"
                            icon={
                                <Icon name="call" width={24} height={24} />
                            }
                            ghost
                            onClick={() => onClickCall(user.name)}
                        >
                            Call
                        </Button>
                    </div>
                </div>
            ))}
        </div>
    );
};
}


下面是用户数据的示例。

const users = [
        {
            name: 'Josh',
            state: 'registered'
        },
        {
            name: 'Mike',
            state: 'in_call'
        }
    ]


我试图更新状态用户列表中,他们在线/离线使用WebSocket实时更新.当我从服务器获取数据时,只改变了state的属性,但组件没有重新渲染。
我试图解决使用不同的refference内存,创建一个新的数组对象使用新的数据,但我仍然没有工作。

bvjxkvbb

bvjxkvbb1#

如我所见,您正确地使用了useState钩子提供的setUsers函数来更新状态。这应该会导致组件的重新呈现,但是,您可能需要检查一些事情。
1.确保您的ws连接是打开的,并正在积极发送邮件。
1.请确保在onmessage处理程序中,您期望在parsedMessage中有一个属性users
1.检查是否正在更新状态中的嵌套属性。
最后一点是关于用户状态的条件呈现代码。条件**user.state = 'REGISTERED'||'registered'将始终计算为true,因为' registered '在JavaScript中是一个truthy值。您可能需要将其更改为'user.state ='REGISTERED'||user.state = 'registered'**用于预期的行为。
希望这个答案能给予你一些提示。

相关问题