javascript - 无法将值添加到数组状态 React
问题描述
我最近发布了一个关于通过 websocket 发送和接收数据的问题。为了不重复大部分工作,原始问题在这里找到:Socket.io emitting undefined variable React
我已经稍微修改了我的应用程序,以便从服务器接收到的每个 id 都被添加或删除到一个disabled
数组中(如果focus
从服务器接收到的参数为 true,则添加 id,如果不是,则删除它)。这样我就可以根据发送的焦点禁用/启用问题。
我所做的细微调整是三倍,都在App.js
文件中
1. 将disabled
数组添加到状态
const [disabled, setDisabled] = useState([])
2.disabled
在问题中包含参数
<TextArea
cols={50}
helperText="Optional helper text here; if message is more than one line text should wrap (~100 character count maximum)"
id="text2"
invalidText="Invalid error message."
labelText="Text area label"
placeholder="Placeholder text"
rows={4}
onFocus={() => setFocusTrue('text2')}
onBlur={() => setFocusFalse('text2')}
disabled={disabled.indexOf('text2')!==-1}
/>
您将在上面注意到,如果 questionId 包含在数组中(因此禁用问题),则disabled
参数将设置为 true,否则为falsedisabled
3.将questionId添加到disabled
状态数组
useEffect(() => {
socket.on("message", ({ user, id, focus }) => {
console.log(user, "clicked on", id, "with focus", focus)
console.log('adding', id, 'to disabled')
setDisabled(prevDisabled => [...prevDisabled, id]);
console.log("disabled:", disabled)
})
}, [])
现在,我只是将来自服务器的所有 questionId 添加到disabled
数组中,这样我就可以测试它们是否确实被添加了。但这是我的问题,因为disabled
数组总是空的(见下面的截图)。id
从设置新状态之前的控制台日志输出中可以看出,该变量存在disabled
,但未按预期添加。
编辑:根据评论,如果我在渲染之前
,我可以看到disabled
数组实际上正在更新。console.log(disabled)
但是,如果我对数组应用任何类型的逻辑,就会出现错误。下面是修改后的useEffect
内容,其中包含一些逻辑(本质上是向数组添加或删除 id)
useEffect(() => {
socket.on("message", ({ user, id, focus }) => {
console.log(user, "clicked on", id, "with focus", focus)
console.log('adding', id, 'to disabled')
if (focus) {
console.log('not my user and focus is true')
setDisabled(prevDisabled => [...prevDisabled, id])
console.log("disabled after adding", disabled)
} else {
let filteredArray = disabled.filter(idToRemove => idToRemove !== id)
setDisabled({disabled: filteredArray});
}
console.log("disabled:", disabled)
})
}, [])
当我单击文本框时,id
问题的 会按预期添加到disabled
数组中,但是当我单击它时,出现以下错误:
disabled.indexOf 不是函数
这指disabled={disabled.indexOf('text1')!==-1}
解决方案
我认为您的代码很好,如果您在设置后立即尝试 console.log 最重新发送的状态,为什么它不起作用?setState 是异步的,它可能无法像您预期的那样实时工作。
你真正想要尝试的是添加一个 useEffect 并监听disabled
状态的变化
useEffect(() => {
console.log("disabled", disabled);
}, [disabled]); // since disabled is in the dependency array this hook function will call, every time when the disabled gets updated.
// so you are so sure the disabled is getting updated correctly
console.log(disabled)
或者只是在渲染之前做一个简单的事情并查看。
如我所见,您的修改版本useEffect
不正确,应更正为
....
const filteredArray = disabled.filter(idToRemove => idToRemove !== id)
setDisabled(filteredArray);
....
推荐阅读
- maven - 如何将 flink fat jar 更改为 Thin jar
- java - 使用 com.rabbitmq.http.client.Client 从 Java 向 RabbitMQ 发送消息
- c# - WPF Grid 向右对齐并覆盖整列
- android - 在 ActivityResultContract 中获取请求代码的默认方式
- android - 当我从 Activity 调用到 Fragment 时,Editext 值变为 Null
- powershell - 如何在不格式化的情况下将字符串传递给程序?
- swift - 带有自定义初始化程序的 SwiftUI 超类声明
- node.js - 如何通过 Azure blob 存储在 node.js 中提供 CDN 图像 URL?
- python - 列表列表 | 将子元素相乘,添加答案(Python)
- javascript - Flutter Web 下载文件在移动浏览器中不起作用