我使用带有React钩子和SignalR的React。我有一些常量属性链接到输入字段
const [name, setEmployeeName] = useState<string>('');
const [id, setEmployeeId] = useState<string>('');
const [project, setProjectName] = useState<string>('');
在聊天教程之后,在useEffect中设置连接和订阅,如
useEffect(() => {
// Set the initial SignalR Hub Connection.
const createHubConnection = async () => {
const hubConnect = new HubConnectionBuilder()
.withUrl(`${url}/emp`)
.build()
try {
await hubConnect.start()
console.log('Connection successful!')
hubConnect.on('update', (employee: Employee) => {
if(id === employee.id) {
setEmployeeName(employee.name)
setProjectName(employee.project)
}
})
}
catch (err) {
alert(err);
console.log(err);
console.log('Error while establishing connection: ' + { err })
}
setHubConnection(hubConnect);
}
createHubConnection();
}, [])
因此,当我从服务器端调用"update"方法并在此处输入实现时,所有这些常量都丢失了,并且为"。
所以这个if(id === employee.id)
总是假的。
对我来说,我似乎需要绑定。这个,但我不认为我们在React中有这个。
好的,所以经过进一步思考,我意识到这不是一个好方法。所以我调整了订阅。将输入更改链接到此方法:
function onIdChange(_id: string) {
if(_id !== id) {
hubConnection!.off(`updateEmployee/${id}`)
setEmployeeId(_id)
hubConnection!.on(`updateEmployee/${_id}`, (employee: Employee) => {
setEmployeeName(employee.name)
setProjectName(employee.project)
})
}
}
因此,现在从服务器上,每当我想调用employeerId的方法时,我已经设置了一个订阅,一旦调用它,我就不再需要执行if语句。