标签: use-ref

在 React 中动态添加后的 getElementById

我正在我的 React 功能组件中动态添加卡片。卡片存储在状态中。我映射它们并给每个人提供 id。OnClick 在那些卡片上我成功地获得了他们的 id。现在我想 getElementById 来改变卡片颜色:

function Clicked(pressedGifId) {
  if (pressedGifId === 'correctGif') CorrectMatch();
  else WrongMatch();
}

function CorrectMatch(pressedGifId) {
  // / THERE I GET Element: null
  console.log('Element:', document.getElementById(pressedGifId));
}
function WrongMatch() {
  console.log('wrong a match!');
}

export default function GameObject(props) {
  const addedToGameGif = [];
  const [pressedGifId, gifPressed] = useState(null);
  const [photoCards, setPhotoCards] = useState([]);

  useEffect(() => {
    Clicked(pressedGifId);
  }, [pressedGifId]);

  // add randomly picked photos to addedToGameGif array
  // ...

  addedToGameGif.map(gifId =>
    photoCards.push(
      <Card id={gifId} onClick={() …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs use-effect use-state use-ref

2
推荐指数
1
解决办法
4771
查看次数

如何将 SignaturePad 与 React TypeScript 结合使用

我正在尝试在我的 React 项目中实现 SignaturePad,并且我可以绘制签名,但我无法访问属性以清除或保存它。我在 ref={signCanvas} 以及 current.clear() 和 signCanvas.current.clear() 和 signCanvas.getTrimmedCanvas().toDataURL("image/png") 上收到以下错误

没有重载与此调用匹配。

  Overload 1 of 2, '(props: Readonly<ReactSignatureCanvasProps>): ReactSignatureCanvas', gave the following error.
    Type 'MutableRefObject<{}>' is not assignable to type 'string | ((instance: ReactSignatureCanvas | null) => void) | RefObject<ReactSignatureCanvas> | null | undefined'.
      Type 'MutableRefObject<{}>' is not assignable to type 'RefObject<ReactSignatureCanvas>'.
        Types of property 'current' are incompatible.
          Type '{}' is missing the following properties from type 'ReactSignatureCanvas': on, off, clear, isEmpty, and 14 more.
  Overload 2 of 2, …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs signaturepad use-ref

2
推荐指数
1
解决办法
2334
查看次数

useRef for element in loop in react

使用 React,我有一个以这种方式静态声明的 ref 列表:

  let line1 = useRef(null);
  let line2 = useRef(null);
  let line3 = useRef(null);
  ...
  //IN MY RENDER PART
  <li ref={(el) => (line1 = el)}>line1</li>
  <li ref={(el) => (line2 = el)}>line1</li>
  <li ref={(el) => (line3 = el)}>line1</li>
Run Code Online (Sandbox Code Playgroud)

然后将 refs 传递给动画函数,一切正常;现在事情发生了一些变化,我使用地图创建了列表项,但我不再能够正确引用该元素;我试过这样的事情:

{menu.menu.map((D) => {
let newRef = createRef();
                    LiRefs.push(newRef);
                    return (
                      <li
                        key={D.id}
                        ref={(el) => (newRef = el)} >
                        {D.label}
                      </li>
                    );
                  })}
Run Code Online (Sandbox Code Playgroud)

但是我传递给动画函数的数组是空的(我猜是因为该函数是在 useEffect 钩子内部调用的,而 LiRefs 还不是 useRef)我也知道

  • 我将创建,所以我可以在开始时声明它们,并使用类似的引用

    ref={(el) => (`line${i}` = el)}
    
    Run Code Online (Sandbox Code Playgroud)

    这对我可以尝试的任何其他解决方案不起作用?

  • reactjs use-ref

    2
    推荐指数
    3
    解决办法
    2509
    查看次数

    useRef、useMemo、useCallback 挂钩的生产用例是什么?

    在外面柜台在很多的YouTube视频教程看到的例子,什么是实用/现实世界中使用案例useMemouseCallback

    另外,我只看到了钩子的输入焦点示例useRef

    请分享您为这些钩子找到的其他用例。

    reactjs react-hooks usecallback use-ref react-usememo

    2
    推荐指数
    1
    解决办法
    1628
    查看次数

    为什么 usePrevious 在第一次渲染时返回未定义 - 反应钩子?

    我想将以前的值存储在变量中并在函数中使用它。假设当前值是 9则前一个值应该是8就像少了一个)。问题是在第一个渲染上console.log(prevServings)返回undefined并在第二个渲染上显示先前的值,但当前值和先前值之间的差异是 2 而不是 1。我的理解是,当前值在第一次渲染时不可用,因此先前的值未定义,但我不知道如何修复它。任何帮助,将不胜感激。提前致谢。

    const Child = ({originalData}) =>{
      //clone original data object with useState
      const [copyData, setCopyDta] = useState({});
      //clone the copied data 
      let duplicate = {...copyRecipe};
      
      
      //store previous servings value into a variable
      const usePrevious = (servings) => {
        const ref = useRef();
        useEffect(() => {
          ref.current = servings;
        }, [servings]);
    
        return ref.current;
      };
      const prevServings = usePrevious(duplicate.servings);
      
      //increase the number of servings on click …
    Run Code Online (Sandbox Code Playgroud)

    api reactjs react-hooks use-ref

    2
    推荐指数
    1
    解决办法
    2084
    查看次数

    React 如何更新 ref?

    import React, { useState, useEffect, useRef } from "react";
    import ReactDOM from "react-dom";
    
    import "./styles.css";
    
    function App() {
      const [minus, setMinus] = useState(1);
      const ref = useRef(null);
    
      const handleClick = () => {
        setMinus(minus - 1);
      };
    
      console.log("-->", ref.current, minus);
    
      useEffect(() => {
        console.log(`denp[minus]>`, ref.current);
      }, [minus]);
    
      return (
        <div className="App">
          {(minus >= 0 || minus <= -5) && <h1 ref={ref}>num: {minus}</h1>}
          <button onClick={handleClick}>minus</button>
        </div>
      );
    }
    
    export default App;
    
    
    Run Code Online (Sandbox Code Playgroud)

    在官方文档中,它说“每当该节点发生变化时,React 都会将其 .current 属性设置为相应的 DOM 节点。”

    所以在 React 渲染 DOM …

    reactjs use-ref

    2
    推荐指数
    1
    解决办法
    5805
    查看次数

    ESLint exhausive-deps:忽略来自 ref 的值

    我有一个实用函数来在引用中存储不断变化的值:

    export function useRefOf<T>(value: T) {
      const ref = useRef(value);
    
      useEffect(() => {
        ref.current = value;
      }, [value]);
    
      return ref;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    但是,当我在效果中使用它时,我不想在值更改时重新渲染:

    const someValueRef = useRefOf(someValue);
    
    useEffect(() => {
      doSomeGreatStuff(someValueRef.current);
    }, [doSomeGreatStuff])
    
    Run Code Online (Sandbox Code Playgroud)

    我违反了 ESLintexhaustive-deps规则:

    React Hook useEffect has a missing dependency: 'someValueRef'. Either include it or remove the dependency array
    
    Run Code Online (Sandbox Code Playgroud)

    我知道如果我使用常规的useRef而不是我的useRefOf,ESLint 不会抱怨。

    useRefOf我如何告诉 ESLint像引用一样对待useRef并容忍它不在依赖数组中?

    reactjs eslint use-ref

    2
    推荐指数
    1
    解决办法
    876
    查看次数

    React useRef 当前值在 useState 回调中分配时触发两次

    问题

    单击该按钮时,将跳过参考当前值的输出。请参阅下面的输出以供参考。但是,如果toggle.current = current + 1位于 useState 回调之外,则它会相应地工作。

    代码

    import "./styles.css";
    import { useState, useRef } from "react";
    
    export default function App() {
      const [array, setArray] = useState(["a"]);
      const toggle = useRef(1);
    
      const handleChange = () => {
        setArray((a) => {
          let current = toggle.current;
          console.log(current);
          toggle.current = current + 1;
          return [...a, "a"];
        });
      };
    
      return (
        <div className="App">
          <h1>Hello CodeSandbox</h1>
          <h2>Start editing to see some magic happen!</h2>
          <button onClick={() => handleChange()}>hi</button>
        </div>
      );
    }
    
    Run Code Online (Sandbox Code Playgroud)

    所需输出

    1 …
    Run Code Online (Sandbox Code Playgroud)

    reactjs use-ref

    1
    推荐指数
    1
    解决办法
    1303
    查看次数

    选择 useEffect Hook 内的 DOM 元素

    我正在尝试选择使用 useRef 挂钩选择的 DOM 中另一个元素内部的元素。

    const editorRef = useRef(null);
    
    Run Code Online (Sandbox Code Playgroud)

    在 useEffect 挂钩内部,我尝试选择 editorRef 上的子元素

    useEffect(() => {
       editorRef.current.querySelector(".ql-editor").innerHTML = post.content; 
    }, []);
    
    Run Code Online (Sandbox Code Playgroud)

    但我得到一个

    类型错误:“无法将属性‘innerHTML’设置为 null”

    但是当我在第一次刷新后保存代码时,它实际上起作用并且innerHTML被填充。

    reactjs next.js use-effect use-ref

    1
    推荐指数
    1
    解决办法
    3221
    查看次数

    如何在 React.createRef() 方法上设置初始值?

    我使用作为当前滚动值的 ref 在我的组件中管理滚动。我不能使用 state 和 setState,因为当用户滚动时 setState 方法会让事情变得非常不稳定和不可能。因此,我决定使用不重新渲染组件的引用,而是在组件重新渲染时保存该值。我的问题是我无法为 ref 设置初始值。当我使用类组件时,我不能使用允许轻松设置初始值的简单 useRef 反应钩子......相反,我使用 React.createRef() 但是当我将值放在括号 () 中时,它不会似乎注册它并且在用户滚动之前是未定义的。我该如何解决? 在此处输入图片说明

    在这里,当组件更新时(例如,当发送一条新消息时),我想确保只有当用户没有在上方某处浏览旧消息时,它才会向下滚动到最新消息。 在此处输入图片说明

    javascript reactjs use-ref

    1
    推荐指数
    1
    解决办法
    182
    查看次数

    反应:从转义键上的输入元素中移除焦点

    我有一个输入标签,当我按下转义键时,我希望输入元素上的焦点消失,这意味着不再有文本光标或任何焦点样式(当用户输入时,他们的输入不会进入输入标签)。

    下面的代码是我尝试实现上述功能的尝试,但它没有按预期工作。我想让这段代码按预期工作。

    import React, { useRef } from 'react';
    
    const onEscape = function (action) {
        window && window.addEventListener('keydown', (e) => {
            if (e.key === "Escape") {
                action();
            };
        });
    };
    
    const MyComponent = () => {
    
        ...
    
        const descRef = useRef();
        onEscape(() => {
            descRef.blur();
        });
    
        return (
            <div>                
                <input
                    ref={descRef}
                    ...
                />
            </div>
       );
    };
    
    Run Code Online (Sandbox Code Playgroud)

    我已经测试了该onEscape函数,并且在将其他操作传递给它时它可以工作(当用户按下转义键时,它会执行传递给 onEscape 函数的任何函数)

    focus ref reactjs react-hooks use-ref

    0
    推荐指数
    1
    解决办法
    3260
    查看次数

    如何使用 useRef 和 useEffect 仅重新渲染单个子组件

    tl;dr - 如何通过跟踪强制重新渲染仅一个特定的子组件ref

    我有一个行表。我希望能够将鼠标悬停在行上并显示/隐藏行中的单元格,但只能在一段时间之后。

    您只能在将鼠标悬停在整个表格上一段时间后(由onMouseEnter和触发)才能显示隐藏的悬停内容onMouseLeave

    一旦将鼠标悬停在特定的 上<Row>,如果父级允许,它应该显示额外的内容。

    鼠标悬停在表格上的顺序:

    1. 将鼠标悬停在行上
    2. isHovered现在是true
    3. 在 1000ms 内,allowHover更改为true
    4. 由于allowHoverisHovered都是true,显示额外的行内容

    鼠标移出表格的顺序:

    1. 鼠标移动到父容器/表/行之外
    2. 之前悬停的行isHovered设置为false
    3. 先前悬停的行的隐藏内容被隐藏
    4. 在 1000ms 内,allowHover更改为false

    此时,如果重新进入表,我们必须再次等待1秒才为allowHover真。一旦 和 都isHoveredallowHover真,则显示隐藏内容。一旦允许悬停,就不会有任何延迟:悬停在其上的行应立即显示隐藏的内容。

    我试图useRef避免改变行父行的状态并导致所有子行的重新渲染

    在行级别,悬停时,行应该能够检查是否允许悬停,而无需使用 props 重新渲染整个列表。我假设useEffect可以设置为跟踪该值,但它似乎不会在单个组件级别触发重新渲染。

    换句话说,预期的行为是当前悬停在行上的行检测父级中的更改,并且仅重新渲染自身以显示内容。然后,一旦允许悬停,行为就很简单。将鼠标悬停在行上?揭示其内容。

    以下是涉及的代码片段:

    function Table() {
      const allowHover = useRef(false);
    
      const onMouseEnter = (e) => …
    Run Code Online (Sandbox Code Playgroud)

    javascript reactjs react-hooks use-state use-ref

    0
    推荐指数
    1
    解决办法
    4958
    查看次数