Node.js React钩子正在覆盖对象数组
我正在尝试使用React钩子和Wit.ai编写聊天机器人接口 我已尝试强制设置消息(setMessages([…messages,currentValue]),但这也不起作用。下面是代码:Node.js React钩子正在覆盖对象数组,node.js,reactjs,react-hooks,wit.ai,Node.js,Reactjs,React Hooks,Wit.ai,我正在尝试使用React钩子和Wit.ai编写聊天机器人接口 我已尝试强制设置消息(setMessages([…messages,currentValue]),但这也不起作用。下面是代码: const [currentValue, setCurrentValue] = useState(''); const [messages, setMessages] = useState([]); const handleChange = (event) => { setCurrentVa
const [currentValue, setCurrentValue] = useState('');
const [messages, setMessages] = useState([]);
const handleChange = (event) => {
setCurrentValue(event.target.value); // handling input change
}
const sendMessage = (event) => {
event.preventDefault();
if (currentValue.trim() !== '' || currentValue.trim().length > 1) {
witClient.message(currentValue).then(data => {
setMessages(() => [...messages, {text: currentValue, sender: 'user'}]); // here i set the user message
if (data.entities) {
setMessages(() => [...messages, {text: 'message from bot', sender: 'bot'}]); // this line seems to overwrite the user message with the bot message
setCurrentValue('');
}
});
}
document.querySelector('input').focus();
}
当我处理bots响应时,它会覆盖用户消息。当您在
if语句之后访问消息时
,您实际上覆盖了第一个更改,因为[…消息,{text:currentValue,sender:'user'}]
将只反映在下一次的渲染中。请一次性设置所有更改以防止出现这种情况
const sendMessage = (event) => {
event.preventDefault();
if (currentValue.trim() !== '' || currentValue.trim().length > 1) {
witClient.message(currentValue).then(data => {
let newMessages = [...messages, {text: currentValue, sender: 'user'}]
if (data.entities) {
newMessages = newMessages.concat({text: 'message from bot', sender: 'bot'})
setCurrentValue('');
}
setMessages(messages)
});
}
document.querySelector('input').focus();
}
由于您依赖于先前的值,所以可以使用函数模式设置状态,如下所示:
文件:
p、 如果有人想知道我的wit ai访问令牌,我可以将其发送给你。我不知道这一点,可能应该查看文档。谢谢!不太知名的功能,因为它没有在指南中发布,而是在某个地方挖掘,刚刚找到它:
setMessages((priorMessages) => [...priorMessages, {text: currentValue, sender: 'user'}]);
======================================
if (data.entities) {
setMessages((priorMessages) => [...priorMessages, {text: 'message from bot', sender: 'bot'}]);