我想為我的元素使用 ref,但出現錯誤,我不知道如何修復它。
Type '{ ref: RefObject<unknown>; letter: string; draggable: number; }' is not assignable to type 'IntrinsicAttributes & content'.
Property 'ref' does not exist on type 'IntrinsicAttributes & content'.
我在網上搜索了一段時間,但找不到任何對我的案例有幫助的資訊。
這是我的代碼:
Content.tsx
import React, { useRef, useState } from 'react';
import { Box } from './Box';
function Content() {
const onSubmitAnswer = () => {
console.log("da");
};
const test = React.createRef();
return (
<div>
<Box {...{ letter: 'C', draggable: 1 }} ref={test}/>
<Box {...{ letter: 'A', draggable: 0 }} />
<Box {...{ letter: 'B', draggable: 0 }} />
<Box {...{ letter: 'C', draggable: 0 }} />
<Box {...{ letter: 'D', draggable: 0 }} />
<button onClick={onSubmitAnswer}>Trimite!</button>
</div>
);
}
export default Content;
和 Box.tsx
import React from 'react';
import './Box.css';
import Draggable, { DraggableData, DraggableEvent } from 'react-draggable';
export type content = {
letter: string,
draggable: number
}
export function Box(props: content) {
const el = React.createRef();
if(props.draggable) {
return (
<Draggable>
<div className="box box-drag">
<span className="box-content">
{props.letter}
</span>
</div>
</Draggable>
);
}
return (
<div className="box">
<span className="box-content" ref={el => {console.log(el?.getBoundingClientRect());}}>
{props.letter}
</span>
</div>
);
}
我想我知道為什么會發生這種情況 - Box 是一個組件,當我將 ref 作為屬性傳遞時(就像我對 JSX 標簽所做的那樣),它的行為不一樣(它在道具中)。
有沒有辦法像在 JSX 元素上使用它們一樣在組件上使用 ref/className/name ?
//編輯:打字稿游樂場鏈接:
https://www.typescriptlang.org/play?ssl=1&ssc=1&pln=1&pc=7#code/JYWwDg9gTgLgBAJQKYEMDGMA0cDecCuAzksgGbZFIDKMKMScAvnKVBCHAORSoacDcAKFCRYXAHQB6AEIQAHuLSFCA4eGjwAIlBQBzXSgBGAGyTY82vQZNJNdFNkv6jpgKIA3JADt4zVuy4edBgAWgATHWcbVUEYAE8wBjQIH294AF5cQTgcuFMYeigALjhCGChgL11MbNyIqxckEq98EEMkKEFGQUFSfC8MYBS4WTkACjA2MEIS5NSfAEos3LhgUgmpwnF6qNMlnFqVnJ4YfCgvODHDo5WAHidrUwA a5uc27Dgdzg0YxRlAByKBASHSACJDPI4JC5OFImCXm8kXBboQwCgLr9-oQgSDwTCQnN6D4Ea9kSscJMINNxPlCt1yTdbpI0RjEYz3pJPu52eTmQ9GrzkQshCsGbkTmcLlckR8vj8-oDgaCIfJSRzUejMYqccr8fJCSliTB1RzcFSaXSOuK SytUKmVyvg7ciKuj0 gMYEMLgBhI1pMb7a5zMpwFJUfCGEDAGAAQS8hAA7h04Jkg2mnss3qGIKZaRBdGMwWEUGC3WKhCGUmH6GHMshgoogvQyLcMXEnkHRblrpLzpcye9uS6maNcOJJ3grcUuL7ONgdo8mnAAIxMZg8UjpHB1mDMSSjo63cc4SfiadIAodEqcOMLuBLxolAAMG7gh6Hx9P58v19nnDSA T42K 76fhqP5TnkV6FLe86LpEy5gYwB5HncUEXjB-63powFIc cBvqhH7obktyGPgBTDCkvrGMAaAANY7hGUYxvGiYplAjBPAAKhU7FIAAhMylHUV4R7MiO1xut0ghIHIojwGESCkCg DGPA-rzDA-BAA
uj5u.com熱心網友回復:
如果你想使用ref,你應該包裝Box成forwardRef:
import React, { useRef, useState } from 'react';
import './Box.css';
import Draggable, { DraggableData, DraggableEvent } from 'react-draggable';
type content = {
letter: string,
draggable: number
}
const Box = React.forwardRef<HTMLDivElement, content>((props, ref) => {
if (props.draggable) {
return (
<Draggable>
<div className="box box-drag">
<span className="box-content">
{props.letter}
</span>
</div>
</Draggable>
);
}
return (
<div className="box">
<span className="box-content">
{props.letter}
</span>
</div>
);
});
function Content() {
const onSubmitAnswer = () => {
console.log("da");
};
const test = React.createRef<HTMLDivElement>();
return (
<div>
<Box {...{ letter: 'C', draggable: 1 }} ref={test} />
<Box {...{ letter: 'A', draggable: 0 }} />
<Box {...{ letter: 'B', draggable: 0 }} />
<Box {...{ letter: 'C', draggable: 0 }} />
<Box {...{ letter: 'D', draggable: 0 }} />
<button onClick={onSubmitAnswer}>Trimite!</button>
</div>
);
}
export default Content;
操場
ref期望是 HTML 元素。這就是為什么我提供HTMLDivElement了const test = React.createRef<HTMLDivElement>();. 它應該是哪個 HTML 元素取決于您。
Box被forwardRef顯式泛型引數包裹:React.forwardRef<HTMLDivElement, content>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317154.html
標籤:javascript 反应 打字稿
