【问题标题】:Using React hooks for the first time and ran into an issue第一次使用 React hooks 遇到了问题
【发布时间】:2020-04-25 23:15:19
【问题描述】:

我几个月来第一次使用 react 并且有史以来第一次使用 hooks。到目前为止,我喜欢它,但我遇到了一个问题,现在已经阻止了我几个小时。

我有一个如下所示的组件:

import React, { useState } from "react";
import ReactModal from "react-modal";
import { useModal } from "react-modal-hook";
import styled from 'styled-components';

export function SearchImageForm(props) {

  const [query, setQuery] = useState("");
  const [images, setImages] = useState("");

  const handleSubmit = (e) => {
    e.preventDefault();

    fetch(`myurl&q=${query}`)
      .then((response) => {
        return response.json();
      })
      .then((myJson) => {
        if (myJson.totalHits > 0) {
          setImages(myJson.hits);
          showModal(images, handleClick);
        }
      });
  };

  const FormWrapper = styled.div`
    text-align: left;
  `;

  const Container = styled.div``;

  const LabelEl = styled.label``;

  const Input = styled.input``;

  const handleClick = (e) => {
    const urlField = document.querySelector('#url');
    urlField.value = e.target.src;
    urlField.select();
    document.execCommand("copy");
    alert('URL has been copied to your clipboard. You may now paste it into the URL field.')
  };

  return (
    <Container>
      <FormWrapper>
        <form onSubmit={handleSubmit}>
          <LabelEl>
            Enter Search Term
            <Input type="text" name="query" value={query} onChange={e => setQuery(e.target.value)} />
          </LabelEl>

          <input type="submit" value="Submit" />
        </form>
      </FormWrapper>
    </Container>
  );
}

export default SearchImageForm;

const ImageResult = ({content, handleClick}) => (
  <picture>
    <img src={content.previewURL} alt="" onClick={handleClick}/>
  </picture>
);


const [showModal, hideModal] = useModal(({images, handleClick}) => (<ReactModal isOpen ariaHideApp={false}>
  <p>Found {images.length} image(s). Click an image to copy its URL to your clipboard.</p>
  {images.map(image => <ImageResult key={image.id} content={image} handleClick={handleClick} />)}
  <input type="text" name="url" id="url" key="url" />
  <button onClick={hideModal}>Hide modal</button>
</ReactModal>));

当我尝试运行它时,我收到 React hooks 错误(Invalid Hook Call)。关于我在这里做错了什么有什么想法吗?

这里是codesandbox 上的代码,虽然我不确定它为什么不能运行。 https://codesandbox.io/s/blue-firefly-0sx6h

谢谢!

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    useModal 钩子需要在你的组件中被调用。

    来自Invalid Hook Call Warning 文档:

    钩子只能在函数组件内部调用。

    所以你需要做的修改如下:

    export function SearchImageForm(props) {
       const [showModal, hideModal] = useModal(({images, handleClick}) => (
          <ReactModal isOpen ariaHideApp={false}>
             <p>Found {images.length} image(s). Click an image to copy its URL to your clipboard. </p>
             {images.map(image => <ImageResult key={image.id} content={image} handleClick={handleClick} />)}
             <input type="text" name="url" id="url" key="url" />
             <button onClick={hideModal}>Hide modal</button>
          </ReactModal>
       ));
    
       // ... rest of your component code
    
       return <>{/* your render */}</>
    }
    

    希望对你有帮助!

    【讨论】:

    • 这确实有帮助,但那是我最初拥有的,实际上!但这导致我在每次更改时都重新呈现我的输入并失去焦点。那你知道如何解决这个问题吗?
    • @LouCapo 进一步的改进可以是使用useCallback 代替handleSubmit,例如这可能会解决问题。在此处进一步阅读:reactjs.org/docs/hooks-reference.html#usecallback
    • 那不会解决重新渲染 onchange 的问题,对吗?
    • @LouCapo 如果您有一个代码框供我检查,那将很有用,因此我可以提供进一步的帮助,谢谢!
    • 我确实做到了,但我无法让它在那里运行...codesandbox.io/s/blue-firefly-0sx6h
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2022-12-18
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多