我正在我的 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) 我正在尝试在我的 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) 使用 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)
这对我可以尝试的任何其他解决方案不起作用?
在外面柜台在很多的YouTube视频教程看到的例子,什么是实用/现实世界中使用案例useMemo和useCallback?
另外,我只看到了钩子的输入焦点示例useRef。
请分享您为这些钩子找到的其他用例。
我想将以前的值存储在变量中并在函数中使用它。假设当前值是 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)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 …
我有一个实用函数来在引用中存储不断变化的值:
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并容忍它不在依赖数组中?
单击该按钮时,将跳过参考当前值的输出。请参阅下面的输出以供参考。但是,如果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) 我正在尝试选择使用 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被填充。
我使用作为当前滚动值的 ref 在我的组件中管理滚动。我不能使用 state 和 setState,因为当用户滚动时 setState 方法会让事情变得非常不稳定和不可能。因此,我决定使用不重新渲染组件的引用,而是在组件重新渲染时保存该值。我的问题是我无法为 ref 设置初始值。当我使用类组件时,我不能使用允许轻松设置初始值的简单 useRef 反应钩子......相反,我使用 React.createRef() 但是当我将值放在括号 () 中时,它不会似乎注册它并且在用户滚动之前是未定义的。我该如何解决?

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

我有一个输入标签,当我按下转义键时,我希望输入元素上的焦点消失,这意味着不再有文本光标或任何焦点样式(当用户输入时,他们的输入不会进入输入标签)。
下面的代码是我尝试实现上述功能的尝试,但它没有按预期工作。我想让这段代码按预期工作。
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 函数的任何函数)
tl;dr - 如何通过跟踪强制重新渲染仅一个特定的子组件ref?
我有一个行表。我希望能够将鼠标悬停在行上并显示/隐藏行中的单元格,但只能在一段时间之后。
您只能在将鼠标悬停在整个表格上一段时间后(由onMouseEnter和触发)才能显示隐藏的悬停内容onMouseLeave。
一旦将鼠标悬停在特定的 上<Row>,如果父级允许,它应该显示额外的内容。
鼠标悬停在表格上的顺序:
isHovered现在是trueallowHover更改为trueallowHover和isHovered都是true,显示额外的行内容鼠标移出表格的顺序:
isHovered设置为falseallowHover更改为false此时,如果重新进入表,我们必须再次等待1秒才为allowHover真。一旦 和 都isHovered为allowHover真,则显示隐藏内容。一旦允许悬停,就不会有任何延迟:悬停在其上的行应立即显示隐藏的内容。
我试图useRef避免改变行父行的状态并导致所有子行的重新渲染
在行级别,悬停时,行应该能够检查是否允许悬停,而无需使用 props 重新渲染整个列表。我假设useEffect可以设置为跟踪该值,但它似乎不会在单个组件级别触发重新渲染。
换句话说,预期的行为是当前悬停在行上的行检测父级中的更改,并且仅重新渲染自身以显示内容。然后,一旦允许悬停,行为就很简单。将鼠标悬停在行上?揭示其内容。
以下是涉及的代码片段:
function Table() {
const allowHover = useRef(false);
const onMouseEnter = (e) => …Run Code Online (Sandbox Code Playgroud) reactjs ×12
use-ref ×12
react-hooks ×4
javascript ×3
use-effect ×2
use-state ×2
api ×1
eslint ×1
focus ×1
next.js ×1
ref ×1
signaturepad ×1
typescript ×1
usecallback ×1