【问题标题】:Unhandled Rejection (TypeError): Cannot read property 'preventDefault' of undefined未处理的拒绝(TypeError):无法读取未定义的属性“preventDefault”
【发布时间】:2020-05-24 19:09:02
【问题描述】:

我不知道如何解决这个问题...请帮帮我,我只是初学者

  const onSubmit = async (e) => { //Here I submit my form
    e.preventDefault();
    const nickname = e.target.nickname.value;
    if (!nickname || !fileUrl) {
      return;
    }
    await db.collection("request").doc(playerID).set({
      nickname: nickname,
      image: fileUrl,
    });
  };

  useEffect(() => {
    const fetchRequest = async () => {
      const requestCollection = await db.collection("request").get();
      setRequest(
        requestCollection.docs.map((doc) => {
          return doc.data();
        })
      );
    };
    fetchRequest();
  }, []);

返回:

  return (
    <Panel id={id}>
      <Div>
          <FormLayout>
             <Input maxLength="16" top="Введите ваш никнейм" nickname={nickname} onChange={(e) => setNickname(e.target.value)} placeholder="Dit"/>
             <Input  maxLength="8" top="Введите ваш игровой ID" playerID={playerID} onChange={(e) => setPlayerID(e.target.value)} type="tel" placeholder="675"/>
             <Select  top="Категория" value={category} onChange={(e) => setCategory(e.target.value)} placeholder="Выберите категорию скина">
               <option value="Обычные скины">Обычные скины</option>
               <option value="Питомцы">Питомцы</option>
               <option value="Частицы">Частицы</option>
             </Select>
             <File type='file' top="Загрузите ваше фото" onChange={onFileChange} before={<Icon24Camera />} controlSize="l">
          Открыть галерею
        </File>
             <Button mode="commerce" size="xl" onClick={(e) => {onSubmit(); onGoHome();}} data-to="home" >Отправить</Button>
              </FormLayout>
              <ul>
        {request.map((playerID) => {
          return (
            <li key={playerID.nickname}>
              <img width="100" height="100" src={playerID.image} alt={playerID.nickname} />
              <p>{playerID.nickname}</p>
            </li>
          );
        })}
      </ul>
  </Div>
    </Panel>
  );
}

如果有人教我,我会很高兴...我使用 Firebase Cloud Firestore 进行数据库和存储。 我试图找到答案,但我找不到

【问题讨论】:

  • 如果您需要更多代码或解释,请告诉我
  • e 参数添加到您的 onSubmit 调用中:onClick={(e) =&gt; {onSubmit(e) ...
  • 我该怎么做?
  • 现在我收到了这个错误:未处理的拒绝(TypeError):无法读取未定义的属性“值”``` constnickname = e.target.nickname.value; ```
  • 出于好奇,您到底想阻止什么默认值?.. 您的按钮只是一个普通按钮,它不是提交类型,所以它唯一要做的就是您输入的内容你的点击。

标签: javascript reactjs firebase


【解决方案1】:

你不能让 React 事件处理程序 async。 React 使用合成(自定义)事件系统,事件实例可能在您的处理程序有机会运行之前丢失。

https://reactjs.org/docs/events.html#event-pooling

解决方案:从onSubmit 中删除async,将异步代码提取到一个新函数中(可能是异步的):

const handleSubmit = async (nickname) => {
    if (!nickname || !fileUrl) {
      return;
    }
    await db.collection("request").doc(playerID).set({
      nickname: nickname,
      image: fileUrl,
    });
}

const onSubmit = async (e) => { //Here I submit my form
    e.preventDefault();
    const nickname = e.target.nickname.value;
    this.handleSubmit(nickname);
  };

【讨论】:

  • 很高兴能帮上忙。简短的更新:“你不能让 React 事件处理程序异步”不是 100% 不正确的。您可以使它们异步,但随后无法访问事件对象(根据经验)。
猜你喜欢
  • 2019-04-07
  • 2019-07-19
  • 2019-06-03
  • 2020-04-09
  • 2019-11-13
  • 2021-10-19
  • 2021-11-15
  • 1970-01-01
  • 2022-11-26
相关资源
最近更新 更多