![](/img/trans.png)
[英]how to use and in the properties section of the html element in react?
[英]How to calcuclate properties from element sizes in React?
假設您的卡片組件是這樣的
function Card({ name }) {
return (
<div className="card">
<div className="card__pic"></div>
<h3 className="card__name" ref={nameRef}>
{name}
</h3>
</div>
);
}
我們所需要的只是包含名稱的元素,即“card__name”。
要訪問這個名稱元素,我們必須使用useRef
鈎子。 以下是您將如何使用它。
function Card({ name }) {
const nameRef = useRef(null);
useEffect(() => {
// nameRef.current is accessible here
}, []);
return (
<div className="card">
<div className="card__pic"></div>
<h3 className="card__name" ref={nameRef}>
{name}
</h3>
</div>
);
}
我們必須將ref={refVariable}
傳遞給我們想要訪問的元素。 refVariable
將在掛載后使用元素節點進行初始化,即我們可以在useEffect
掛鈎中使用它。
現在既然我們有了元素,我們可以用它來檢查里面的文本是否溢出。 我創建了一個 function isTextOverflowingCard
,我們將引用傳遞給我們在安裝后獲得的元素。 如果文本溢出,它將返回 true,否則返回 false。
function isTextOverflowingCard(textElement) {
if (textElement.scrollWidth > textElement.clientWidth) {
return true;
}
return false;
}
現在在 Card 內部,我們可以使用這個 function 並根據它的返回值,有條件地添加一個 class ,它將具有緊密的字母間距值。
function Card({ name }) {
const nameRef = useRef(null);
const [textOverflow, setTextOverflow] = useState(false);
useEffect(() => {
// nameRef.current is accessible here
setTextOverflow(isTextOverflowingCard(nameRef.current));
}, []);
return (
<div className="card">
<div className="card__pic"></div>
<h3 className={`card__name ${textOverflow ? 'card__name--tight-kerning' : ''}`} ref={nameRef}>
{name}
</h3>
</div>
);
}
在 CSS 中,
.card__name--tight-kerning {
letter-spacing: -2px;
}
可以將useEffect改成useLayoutEffect,這樣更適合這種dom相關的計算並應用於ui。
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.