javascript - 如何从 React 中的另一个组件滚动到一个组件?

标签 javascript reactjs scroll components

我有一个表单,在提交时会显示表单的结果,但更重要的是,它会滚动到显示结果的组件。我一直在尝试传递引用和转发引用。我见过的所有演示都是同一文件中的组件。我的设置如下:

App.js 包含两个组件——提交表单的 Form.js 和显示表单结果的 Results.js提交。 Results.js 组件位于页面下方,因此我想在用户单击表单上的输入后滚动到该组件。

这是一个codesandbox这演示了我的设置。

这里是相同的代码:

// App.js
import "./styles.css";
import Form from "./Form";
import Results from "./Results";

export default function App() {
  return (
    <>
      <Form />
      <Results />
    </>
  );
}
// Form.js
import { forwardRef, useState } from "react";

const Form = forwardRef(({ onScroll }, ref) => {
  const [name, setName] = useState("");

  const onSubmit = (e) => {
    e.preventDefault();
    onScroll();
  };

  return (
    <form onSubmit={onSubmit} className="tall">
      <input value={name} onChange={(e) => setName(e.target.value)} />
      <button type="submit">Submit</button>
    </form>
  );
});

export default Form;


// Results.js

import { useRef } from "react";
export default function Results() {
  const resultsRef = useRef();

  function handleScrollToResults() {
    resultsRef.current.scrollIntoView({ behavior: "smooth" });
  }

  return (
    <div onScroll={handleScrollToResults}>
      <h1>Results</h1>
    </div>
  );
}

最佳答案

需要纠正的地方不多。

  1. Results 组件应该转发 ref,而不是 Form 组件。
import { forwardRef } from "react";

const Results = forwardRef((props, ref) => {
  return (
    <div ref={ref}>
      <h1>Results</h1>
    </div>
  );
});

export default Results;
  1. Form 组件应该接收对 Results 的引用作为 prop (resultRef)。
import { useState } from "react";

const Form = ({ resultRef }) => {
  const [name, setName] = useState("");

  const onSubmit = (e) => {
    e.preventDefault();
    resultRef.current.scrollIntoView({ behavior: "smooth" });
  };

  return (
    <form onSubmit={onSubmit} className="tall">
      <input value={name} onChange={(e) => setName(e.target.value)} />
      <button type="submit">Submit</button>
    </form>
  );
};

export default Form;
  1. 根组件应使用 useRef 创建 ref 并按如下方式使用它。请注意,Form 使用 resultRefResults 正在实例化它。
import "./styles.css";
import Form from "./Form";
import Results from "./Results";
import { useRef } from "react";

export default function App() {
  const resultRef = useRef(null);

  return (
    <>
      <Form resultRef={resultRef} />
      <Results ref={resultRef} />
    </>
  );
}

Edit Scroll Component (forked)

关于javascript - 如何从 React 中的另一个组件滚动到一个组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71278497/

相关文章:

javascript - 如何在 redux reducer 中改变状态数组?

javascript - 组件本地状态未使用 react 自定义 Hook 更新

php - PHP Youtube嵌入无法滚动

javascript - 带有 addEventListener 的移相器

javascript - 如何使用 next.js 指定子样式?

javascript - 如何显示/隐藏内容

jquery - 滚动经过 anchor div 时向 anchor 链接添加类 - jquery

javascript - 将 onClick 传递给 Material-ui 按钮 - 仅有效一次

reactjs - 未定义(未定义,未定义): Cannot find type definition file for 'src' . TS2688 中的 typescript 错误

css - 如何能够在 flexbox (CSS) 内滚动覆盖 div?