当前位置: 首页 > 知识库问答 >
问题:

您可以在同一个函数中多次调用同一个useState钩子吗?

谷梁向荣
2023-03-14

因此,在重构我的基于类的聊天机器人组件以使用反应钩子的过程中,我遇到了一个使用状态钩子覆盖状态中的对象的问题。这导致只有机器人响应显示在用户界面中。当我与机器人聊天时,用户界面中显示的用户输入的闪光会被聊天机器人的响应覆盖。下面是代码:


export const Chatbot = () => {
  const [messages, setMessages] = useState([]);
  const [value, setValue] = useState("");

  async function df_text_query(text) {
    let says = {
      speaks: "me",
      message: {
        text: {
          text
        }
      }
    };
    setMessages([...messages, says]);

    const res = await axios.post("/api/df_text_query", {
      text,
      userID: cookies.get("userID")
    });

    // Handles fullfillment routes for dialogflow
    res.data.fulfillmentMessages.forEach(message => {
      says = {
        speaks: "bot",
        message
      };
      setMessages([...messages, says]);
    });
  }

  const handleChange = e => {
    setValue(e.target.value);
  };

  const handleSubmit = e => {
    e.preventDefault();
    if (value !== "") {
      const message = value.split();
      df_text_query(message);
    }
    setValue("");
  };

  const handleButtonSend = async event => {
    const eventText = event.target.innerText;
    await setValue(eventText);
    const message = value.split();
    await df_text_query(message);
    await setValue("");
  };

  return (
    <div>
      <div>chatbot code here</div>
    </div>
  );
};

可以这样在同一个异步函数中写入useState两次吗?如果不是,您建议我如何重构此代码,以便消息状态返回一个交替对象数组,例如:

[{says: {
   speaks: "me",
   message: {
       text: {
          text
       }
    }
  }
},
{says: {
   speaks: "bot",
   message: {
      text: {
        text
      }
     }
   }
 },
{says: {
   speaks: "me",
   message: {
       text: {
          text
       }
    }
  }
},
{says: {
   speaks: "bot",
   message: {
      text: {
        text
      }
     }
   }
 }
]```

Any answer would be very much appreciated. I've been stuck on this problem for a while now. If you need more information I'm happy to provide!

Cheers,

Jacks


共有1个答案

曹和正
2023-03-14

试着这样做:

 async function df_text_query(text) {
    let says = [{
      speaks: "me",
      message: {
        text: {
          text
        }
      }
    }];

    const res = await axios.post("/api/df_text_query", {
      text,
      userID: cookies.get("userID")
    });

    // Handles fullfillment routes for dialogflow
    let saysBatch = [says, ...res.data.fulfillmentMessages.map(message => ({
        speaks: "bot",
        message
      }))];
    setMessages([...messages, ...saysBatch]);
 类似资料:
  • 有一个带有正方形的板,其值取决于数组,它由hook处理。每次单击都会将值提高一,但不幸的是,它会将值提高两次(第一次单击除外)。 我的问题是: (1) 为什么会发生这种情况,(2)如何避免它,以及,一般来说,(3)有没有更好的方法来处理这样一个带有钩子的数组。 日志: 可以看出,从第二次点击开始,每次点击都会提高两次值。

  • 当我多次调用同一个函数时,每次都传递了不同的参数,我会这样做: 有没有更方便的方法做到这一点呢?

  • 一个trait中的静态函数可以调用同一trait中的另一个静态函数吗?假设我有以下特点: 那不行。代码不能在这里编译。 此外,没有类型让我使用完全限定的语法,如

  • 问题内容: 我试图弄清楚如何使用argparser执行以下操作: 本身是一个子命令。我的目标是使脚本具有链接一系列子命令(成为其中一个命令)并按顺序执行它们的能力。在上面的示例中,它将执行构建,然后设置环境,然后再次执行构建。如何使用argparse完成此操作?我尝试了以下方法: 但是,似乎每次执行此操作时,它都会进入子命令并报告它不知道是什么。我尝试解析额外的内容,以便可以执行重复调用/链,但是

  • 问题内容: 是否可以使用Golang一次声明多个变量? 例如,在Python中,您可以输入以下内容: 所有值均为80。 问题答案: 是的你可以: 您可以对内联分配执行类似的操作,但不太方便:

  • 如果我有一个接受两个回调的函数的存根,当存根函数被调用时,我如何连接sinon.js来调用两个回调? 例如,这里有一个我想存根的函数,它接受两个函数作为参数: 我可以用sinon来称呼其中一个论点: 或者 但我似乎不能让两者都被召唤。如果我尝试: 或者 那么sinon只会调用第二个参数。如果我以另一个顺序连接它,那么sinon将调用第一个参数。然而,我希望两者都被一个接一个地称呼。