我正在尝试使用“静态”模式创建输入组件。在此模式下,输入将被包含输入值的范围替换。在这个问题中,我使用范围输入。
import React from 'react';
import ReactDOM from 'react-dom';
const { useState, useEffect, } = React;
const RangeInput = ({
inputID, min, max, defaultValue, children,
}) => {
const [valueAfterStaticChange, setValueAfterStaticChange] = useState(
defaultValue
);
const [isStatic, setIsStatic] = useState(false);
useEffect(
() => () => {
// do this before component unmounts and when 'isStatic' changes,
// but only when 'isStatic' is true
isStatic
|| setValueAfterStaticChange(document.getElementById(inputID).value);
},
[isStatic]
);
return (
<div>
<label htmlFor={inputID}>{children}</label>
<span style={{ display: isStatic || 'none', }}>
{valueAfterStaticChange}
</span>
<input
type="range"
min={min}
max={max}
defaultValue={valueAfterStaticChange}
id={inputID}
style={{ display: isStatic && 'none', }}
/>
<button
onClick={() => {
setIsStatic(!isStatic);
}}
>
Toggle Static
</button>
</div>
);
};
ReactDOM.render(
<RangeInput inputID="myID" min={0} max={100} defaultValue={50}>
My Range Input
</RangeInput>,
document.getElementById('root')
);
上面的代码有效。但它display: none用来模拟'无渲染'。我以为我可以使用以下逻辑完成实际的卸载:
// all unchanged until... return ( <div> <label htmlFor={inputID}>{children}</label> {isStatic ? ( <span>{valueAfterStaticChange}</span> ) : ( <input type="range" min={min} max={max} defaultValue={valueAfterStaticChange} id={inputID} /> )} <button onClick={() => { setIsStatic(!isStatic); }} > Toggle Static </button> </div> );};
不知怎的,我的useEffect
返回函数在它实际卸载时不会正确读取输入。我认为使用return函数useEffect
会导致函数在组件卸载之前运行。我究竟做错了什么?
汪汪一只猫
相关分类